繁体   English   中英

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

[英]Making function template parameter unsigned in C++11

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

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不是限定类型。

是否有解决方案实际上有效?

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

你忘记了'typename'

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM