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

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

本文关键字:无符号整数 符号 整数 任何 比较 函数 用于 C++      更新时间:2023-10-16

我想实现一个比较两种类型(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;
}
}

在安全的情况下,它会起作用,如果语言没有达到你想要的效果,你可以添加你的专业。