模板类中,或模板函数中,若限定模板参数为数值类型,可以使用如下方式进行判断.
- 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:
如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!
