在 C++ 中, Type Traits(类型特性)是一组极其强大的模板类和函数, 它们为我们提供了一种在编译时查询, 修改和操作类型信息的机制. Type Traits 是 C++ 标准库 <type_traits> 头文件的核心内容, 其背后利用了模板元编程(Template Meta Programming)这一高深的技术, 使得程序能够在编译时进行诸如类型检查, 类型转换和类型选择等操作, 进而显著提高代码的安全性, 性能和灵活性.
1. 查询或判断类
- 编译时类型检查: 可以在编译时确定某个类型是否满足特定的条件, 例如是否为整数类型, 是否为指针类型等.
- 类型转换: 在编译时对类型进行转换, 例如移除引用, 添加常量限定符等.
- 类型选择: 根据不同的条件在编译时选择不同的类型.
基础类型判断
这类 Traits 主要用于判断一个类型是否属于某种特定的类别, 并且会返回一个布尔值. 下面是一些常用的基础类型判断:
-
is_integral: 判断一个类型是否为整型.static_assert(std::is_integral<int>::value); static_assert(std::is_integral_v<int>); // 上例的简写 static_assert(!std::is_integral_v<double>); -
is_floating_point: 判断一个类型是否为浮点类型.static_assert(std::is_floating_point<float>::value); static_assert(std::is_floating_point_v<float>); static_assert(!std::is_floating_point_v<std::string>); -
is_pointer: 判断一个类型是否为指针类型.static_assert(std::is_pointer<int*>::value); static_assert(std::is_pointer_v<int*>); static_assert(!std::is_pointer_v<int>);
复合类型判断
复合类型判断可以帮助我们判断一个类型是否为基础类型, 对象类型, 复合类型或引用类型等.
is_fundamental: 判断一个类型是否为基础类型(如整型, 浮点型, 布尔型等).static_assert(std::is_fundamental<int>::value); static_assert(std::is_fundamental<bool>::value); static_assert(std::is_fundamental<double>::value); static_assert(std::is_fundamental<void>::value); struct MyStr { }; static_assert(std::is_fundamental<std::string>::value == false); static_assert(std::is_fundamental<MyStr>::value == false);is_object: 判断一个类型是否为对象类型(不是函数, 引用或void类型).static_assert(std::is_object<std::string>::value);is_compound: 判断一个类型是否为复合类型(不是基础类型).static_assert(std::is_compound<std::string>::value);is_reference: 判断一个类型是否为引用类型.// is_reference static_assert(std::is_reference<int&>::value); static_assert(std::is_reference<int&&>::value); static_assert(std::is_reference<int>::value == false);
类型属性
类型属性判断可以帮助我们了解一个类型是否具有某些特定的属性, 比如是否为常量类型, 易变类型或平凡类型等.
-
is_const: 判断一个类型是否为常量类型.static_assert(std::is_const<const int>::value); static_assert(!std::is_const<int>::value); -
is_volatile: 判断一个类型是否为易变类型.static_assert(std::is_volatile<volatile int>::value); static_assert(!std::is_volatile<int>::value); -
is_trivial: 判断一个类型是否为平凡类型(默认构造函数, 析构函数和拷贝构造函数都是平凡的).struct TrivialStruct { int x; };

最低0.47元/天 解锁文章
1281

被折叠的 条评论
为什么被折叠?



