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

C++ template function to compare any unsigned and signed integers

我想实现一个模板函数来比较两种类型(T1 和 T2)的两个变量。这些类型是两种随机的无符号或有符号整数类型。

为了能够正确比较它们,我需要将它们都转换为 'bigger' 整数类型 (T3)。不幸的是,signed/unsigned 比较的升级规则总是升级为无符号类型。

那么,我如何在 C++11/C++14/C++17 中找到一个类型 T3,它涵盖两个整数类型 T1 和 T2,无论它们具有哪种大小和符号? 如果这不可能,是否有其他解决方案来构建基于模板的比较函数,该函数可以可靠地处理任何整数组合?

我不确定我是否理解你的问题。你的意思是这样的吗:

#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如果语言没有按照您的要求进行。

您可以将比较分成几部分。首先检查一个数是否为负数,另一个是否为正数。如果是这种情况,您知道它们的顺序。如果两者都不是负数(或两者都是),只需进行正常比较即可。

这可以构建在一个模板函数中,该函数将只检查有符号类型的负数。