在 C++11 中使函数模板参数无符号

Making function template parameter unsigned in C++11

本文关键字:参数 无符号 函数模板 C++11      更新时间:2023-10-16

在如下所示的模板函数中:

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++无效,第二个版本破坏了构建,因为编译器看到 T 时不是限定类型make_unsigned

有没有真正有效的解决方案?

注意:以某种方式与获取没有显式特征的整数模板参数的有符号/无符号变体相关/几乎相同,尽管函数而不是类(因此没有 typedefs),特征或 C++11 的任何功能明确欢迎,并且首选工作解决方案(即make_unsigned<T>)。

你忘记了"类型名"

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;