代码之家  ›  专栏  ›  技术社区  ›  Silicomancer

比较任何无符号和有符号整数的C++模板函数

  •  1
  • Silicomancer  · 技术社区  · 6 年前

    为了能够正确地比较它们,我需要将它们都转换为一个“更大”的整数类型(T3)。有符号/无符号比较的提升规则总是提升为无符号类型。

    那么,如何在C++11/C++14/C++17中找到一个类型T3,它包含两个整数类型T1和T2,而不管它们的大小和有符号性如何? 如果这是不可能的,有没有其他解决方案,建立一个基于模板的比较函数,可靠地与任何整数组合?

    2 回复  |  直到 6 年前
        1
  •  2
  •   1201ProgramAlarm    6 年前

    你可以把比较分成几个部分。首先检查一个数字是负数,另一个是正数。如果是这样的话,你知道他们的顺序。如果两者都不是负的(或者两者都是),就做一个正常的比较。

        2
  •  0
  •   Escualo    6 年前

    我不太明白你的问题。你的意思是这样的:

    #include <cstdint>
    #include <type_traits>
    
    template < typename P, typename Q >
    auto
    compare( P p, Q q ) {
      using T = typename std::common_type< P, Q >::type;
      T promoted_p{p};
      T promoted_q{q};
    
      if ( promoted_p < promoted_q ) {
        return -1;
      }
      else if ( promoted_p > promoted_q ) {
        return 1;
      }
      else {
        return 0;
      }
    }
    

    在安全的情况下工作,并且 you can add your specializations 如果语言不是你想要的。