在一个看起来像这样的模板函数中:
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
.
有没有真正有效的解决方案?
(注意:在某种程度上与Get the signed/unsigned variant of an integer template parameter without explicit traits相关/几乎相同,尽管是函数而不是类(所以没有 typedefs),特征或 C++11 的任何特性明确欢迎,并且可以工作解决方案(即不是 make_unsigned<T>
)首选。)