【问题标题】:C++ template function to compare any unsigned and signed integers用于比较任何无符号和有符号整数的 C++ 模板函数
【发布时间】:2018-10-28 00:18:05
【问题描述】:

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

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

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

【问题讨论】:

  • 这种方法不适用于最大的类型,即如果T1 是最大的有符号类型,而T2 是它的无符号类型。
  • 比较是什么意思?绝对值?
  • @Escualo:你的代码是我想做的。但没有超载。我需要给我一个 T3 的代码,它可以包含 T1 和 T2 而不会损失精度。 common_type 不这样做。

标签: c++ templates comparison integer-promotion


【解决方案1】:

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

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

【讨论】:

  • template<class T> bool is_negative(T const&t){ return t<0; } 将编译为 false 用于无符号值;无需花哨。
【解决方案2】:

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

#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

【讨论】:

  • 这与让促销以通常的方式发生有什么不同吗?
  • 它允许您控制促销,初始化会警告您丢失精度,在这种情况下您需要专门化特征。
  • 链接页面说,专业化需要两种类型中的一种来依赖于用户定义的类型。
  • 这就是我想做的。但我不知道 common_type 有什么帮助。 common_type 似乎与隐式提升完全相同。当失去精度时,我已经从 clang 代码模型检查器收到了强制转换警告。当然,我可以添加各种重载,但这不是我想要解决问题的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
相关资源
最近更新 更多