C++ 智能抑制错误最大值(大小,整数)
我有很多代码调用max(int,size\u t); 有没有更聪明的方法来抑制这个错误 这有点傻,因为它与max(int,0)一起工作 我可以这样做:C++ 智能抑制错误最大值(大小,整数),c++,C++,我有很多代码调用max(int,size\u t); 有没有更聪明的方法来抑制这个错误 这有点傻,因为它与max(int,0)一起工作 我可以这样做:size\u t I=0 #include <algorithm> int main() { size_t i = 2; size_t m = std::max(i, size_t(2)); // size_t m = std::max(i, 2); error: no matching function for call
size\u t I=0代码>
#include <algorithm>
int main()
{
size_t i = 2;
size_t m = std::max(i, size_t(2));
// size_t m = std::max(i, 2); error: no matching function for call to 'max(size_t&, int)'
}
#包括
int main()
{
尺寸i=2;
尺寸m=std::max(i,尺寸t(2));
//size\u t m=std::max(i,2);错误:调用“max(size\t&,int)”时没有匹配的函数
}
通常我更喜欢std::max(I,2)
;它有一个类似的效果(实际上,它要好一点,因为没有显式的强制转换,这可能会使更有趣的警告静音),并避免了参数列表的混乱
另一种方法是编写自己的max
,它接受不同类型的参数并返回“正确”的公共类型(类似于使用宏执行):
模板
自动我的最大值(T,U)->取消类型(1?T:U){
返回t>u?t:u;
}
除了强制转换(使用静态\u强制转换
非功能样式强制转换)之外,您还有几个选项。如前所述,将i
更改为int,提供一个显式模板参数max(i,2)
,您还可以使用无符号长文本max(i,2UL)
(这假设系统上的大小为无符号长)C++没有提供一个文字后缀,它会告诉编译器“代码> 2”/代码>应该有类型<代码> siZeSt,所以这个转换可能是你能做的最好的事情(除非你想把那个<代码> 2代码>变成一个命名常量-另一种选择)。出于这种目的,函数式或C风格的强制转换比笨重的静态强制转换更合适@AnT:嗯,还有大小运算符“”\st(unsigned long long x){return x;}
。只是没有预定义的后缀。
template<typename T, typename U>
auto my_max(T t, U u) -> decltype(1?t:u){
return t>u?t:u;
}