在 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++无效,第二个版本破坏了构建,因为编译器看到 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;
相关文章:
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- C++如何将变量传递给带有无符号 int & 的参数uint16_t函数?
- 是否可以确定函数的参数是否已签名或无符号,以实现可能性超载函数
- 模板参数可以既是 int 又可以是无符号长整型吗?
- 在与时间一起使用 srand 时,如果我没有time_t参数明确地将参数转换为无符号的 int 参数,这有关系吗?
- Variadic模板参数包只接受无符号int或size_t作为其类型
- 如何获得无符号的int作为控制台参数
- 使用 Boost.Python 使用无符号字符和参数公开方法
- 为什么丢弃的参数类型是无符号长长
- 推导出非类型模板参数无符号 int/size_t
- 当将负文字作为无符号参数传递时,可以g++警告
- C++:比较可变参数无符号 int 模板参数的帮助程序
- 禁止使用boost::p rogram_options对无符号值进行负参数
- 在编译模板方面,char、有符号char或无符号char参数类型的函数重载
- 在 x86-64 平台上为 C(++) 中的 64 位无符号参数计算 (a*b)%n FAST
- 有符号/无符号不匹配,并且函数在转换为函数时不带2个参数
- 在 C++11 中使函数模板参数无符号
- 无法将参数 1 从"cli::array<Type> ^"转换为"无符号短整型"
- C ++如何将我的命令行参数(MAC地址)转换为无符号字符
- 反汇编函数参数(无符号__int8)大海捞针[19] << 8)