c++模板参数——数值类型推断
程序员文章站
2022-05-28 20:03:16
模板类中,或模板函数中,若限定模板参数为数值类型,可以使用如下方式进行判断. 以上代码节选自muduo. 其中主要推断方式是通过调用std::is_arithmetic. 若 T 为算术类型(即整数类型或浮点类型)或其修饰类型(添加注入const等),则提供等于 true 的成员常量 valu ......
模板类中,或模板函数中,若限定模板参数为数值类型,可以使用如下方式进行判断.
1 template<typename t> 2 fmt::fmt(const char *fmt, t val) 3 { 4 static_assert(std::is_arithmetic<t>::value != 0, "must be arithmetic type"); 5 6 length_ = snprintf(buf_, sizeof buf_, fmt, val); 7 assert(static_cast<size_t>(length_) < sizeof buf_); 8 }
以上代码节选自muduo.
其中主要推断方式是通过调用std::is_arithmetic<t>.
若 t
为算术类型(即整数类型或浮点类型)或其修饰类型(添加注入const等),则提供等于 true 的成员常量 value
。对于任何其他类型, value
为 false 。
示例代码:
1 #include <iostream> 2 #include <type_traits> 3 4 class a {}; 5 6 int main() 7 { 8 std::cout << std::boolalpha; 9 std::cout << "a: " << std::is_arithmetic<a>::value << '\n'; 10 std::cout << "bool: " << std::is_arithmetic<bool>::value << '\n'; 11 std::cout << "int: " << std::is_arithmetic<int>::value << '\n'; 12 std::cout << "int const: " << std::is_arithmetic<int const>::value << '\n'; 13 std::cout << "int &: " << std::is_arithmetic<int&>::value << '\n'; 14 std::cout << "int *: " << std::is_arithmetic<int*>::value << '\n'; 15 std::cout << "float: " << std::is_arithmetic<float>::value << '\n'; 16 std::cout << "float const: " << std::is_arithmetic<float const>::value << '\n'; 17 std::cout << "float &: " << std::is_arithmetic<float&>::value << '\n'; 18 std::cout << "float *: " << std::is_arithmetic<float*>::value << '\n'; 19 std::cout << "char: " << std::is_arithmetic<char>::value << '\n'; 20 std::cout << "char const: " << std::is_arithmetic<char const>::value << '\n'; 21 std::cout << "char &: " << std::is_arithmetic<char&>::value << '\n'; 22 std::cout << "char *: " << std::is_arithmetic<char*>::value << '\n'; 23 }
运行结果:
1 a: false 2 bool: true 3 int: true 4 int const: true 5 int &: false 6 int *: false 7 float: true 8 float const: true 9 float &: false 10 float *: false 11 char: true 12 char const: true 13 char &: false 14 char *: false
ps:
std::is_integral<t> //检查模板参数是否为整形
std::is_flotaing_point<t> //检查模板参数是否为浮点数类型
ps:
如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!
推荐阅读
-
Mybatis Integer类型参数值为0时得到为空的解决方法
-
c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?
-
C++可变参数模板
-
c++模板参数——数值类型推断
-
c++类模板的声明与调用,与普通模板函数的区别,类模板可以有默认的参数
-
C++程序员应了解的那些事(68)非类型模板参数
-
postman做接口测试,body穿json格式的参数,json中的参数值是list类型,且列表项是图片时如何传参
-
Effective Modern C++ 笔记(一)——类型推断
-
c/c++ 模板 类型推断
-
C++模板编程、单重继承、多重继承格式及构造函数值传递、运算符重载等难点讲解