用于比较任何无符号和有符号整数的 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如果语言没有按照您的要求进行。
您可以将比较分成几部分。首先检查一个数是否为负数,另一个是否为正数。如果是这种情况,您知道它们的顺序。如果两者都不是负数(或两者都是),只需进行正常比较即可。
这可以构建在一个模板函数中,该函数将只检查有符号类型的负数。
我想实现一个模板函数来比较两种类型(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如果语言没有按照您的要求进行。
您可以将比较分成几部分。首先检查一个数是否为负数,另一个是否为正数。如果是这种情况,您知道它们的顺序。如果两者都不是负数(或两者都是),只需进行正常比较即可。
这可以构建在一个模板函数中,该函数将只检查有符号类型的负数。