C++模板函数,用于比较任何无符号整数和有符号整数
C++ template function to compare any unsigned and signed integers
我想实现一个比较两种类型(T1和T2(的两个变量的模板函数。这些类型是两种随机的无符号或有符号整数类型。
为了能够正确地比较它们,我需要将它们都强制转换为"更大"的整数类型(T3(。不幸的是,已签名/未签名比较的提升规则总是提升为未签名类型。
那么,我如何在C++11/C++14/C++17中找到一个涵盖两个整数类型T1和T2的类型T3,无论它们的大小和有符号性如何?如果这不可能,是否有其他解决方案可以构建一个基于模板的比较函数,该函数可以可靠地与任何整数组合配合使用?
您可以将比较拆分为多个部分。首先检查一个数字是负数,另一个是正数。如果是这样的话,你知道它们的顺序。如果两者都不是负的(或者两者都是(,就做一个正常的比较。
这可以构建在一个模板函数中,该函数只检查签名类型的负数。
我不确定我是否理解你的问题。你的意思是这样的吗:
#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;
}
}
在安全的情况下,它会起作用,如果语言没有达到你想要的效果,你可以添加你的专业。
相关文章:
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 计算机使用什么方法添加无符号整数
- boost::任何带有结构体和无符号整数
- 添加有符号和无符号整数
- 如何安全地比较两个无符号整数计数器?
- 计算 (64 位无符号整数) * (64 位无符号整数) 的商除以 2^64
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 如何将以"\0"开头的字符 * 转换为无符号整数?
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 为大无符号整数分配内存的有效方法