【发布时间】:2023-03-18 00:15:01
【问题描述】:
在一个看起来像这样的模板函数中:
template<typename T> constexpr T foo(T a, T b) { return /*recursive call*/; }
我收到关于比较有符号和无符号的警告(由于与 sizeof 比较),我想消除它。
从概念上讲,需要这样的东西:
template<typename T> constexpr T foo(T a, unsigned T b) { ... }
or
template<typename T> constexpr T foo(T a, std::make_unsigned<T>::type b) { ... }
不幸的是,第一个版本不是有效的 C++,第二个版本破坏了构建,因为当编译器看到 make_unsigned 时 T 不是限定类型。
是否有实际可行的解决方案?
(注意:在某种程度上与/几乎相同Get the signed/unsigned variant of an integer template parameter without explicit traits,虽然函数而不是类(所以没有 typedefs),C++11 的特征或任何特性明确欢迎,并且有效的解决方案(即 not make_unsigned<T>) 首选。)
【问题讨论】: