Dam*_*mon 9 c++ templates c++11
在模板函数中,如下所示:
template<typename T> constexpr T foo(T a, T b) { return /*recursive call*/; }
Run Code Online (Sandbox Code Playgroud)
我收到一个关于比较已签名与未签名(由于比较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) { ... }
Run Code Online (Sandbox Code Playgroud)
不幸的是,第一个版本不是有效的C++,第二个版本打破了构建,因为在编译器看到时T不是限定类型make_unsigned.
是否有解决方案实际上有效?
(注意:以某种方式与获取整数模板参数的有符号/无符号变体没有显式特征相关/几乎相同,虽然函数而不是类(因此没有typedef),特征或C++ 11的任何特性明确欢迎,并且工作解决方案(即不是 make_unsigned<T>)首选.)
bam*_*s53 10
你忘记了'typename'
template<typename T>
constexpr T foo(T a, typename std::make_unsigned<T>::type b) { ... }
Run Code Online (Sandbox Code Playgroud)
在C++ 14中,您应该能够编写
template<typename T>
constexpr T foo(T a, std::make_unsigned_t<T> b) { ... }
Run Code Online (Sandbox Code Playgroud)
或者您可以在C++ 11中自己实现:
template<typename T>
using make_unsigned_t = typename std::make_unsigned<T>::type;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1272 次 |
| 最近记录: |