9

在一个看起来像这样的模板函数中:

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>)首选。)

4

1 回答 1

10

您忘记了“类型名称”

template<typename T>
constexpr T foo(T a, typename std::make_unsigned<T>::type b) { ... }

在 C++14 中,您应该能够编写

template<typename T>
constexpr T foo(T a, std::make_unsigned_t<T> b) { ... }

或者您可以自己在 C++11 中实现:

template<typename T>
using make_unsigned_t = typename std::make_unsigned<T>::type;
于 2012-07-03T15:35:16.647 回答