元编程库 (C++11 起)
C++ 提供元编程设施,诸如类型特征、编译时有理数算术,以及编译时整数序列。
定义
以下类型统称为可引用类型:
对于任何可引用类型 T
,都可以创建到它的引用[1]。
类型特征
类型特征定义基于模板的编译时接口,用以查询类型的属性。
试图特化在标头 <type_traits> 定义且在本页列出的模板会导致未定义行为,但可以按描述要求特化 std::common_type 和 std::basic_common_reference (C++20 起)。
除非另有说明,标头 <type_traits> 定义的模板都可以用不完整类型实例化,尽管以不完整类型实例化标准库模板通常是禁止的。
基类
大部分非变换类型特征需要无歧义地公开继承 std::integeral_constant,以满足一元类型特征 (UnaryTypeTrait) 或二元类型特征 (BinaryTypeTrait) 的要求。
在标头
<type_traits> 定义 | |
(C++11)(C++17) |
具有指定值的指定类型的编译期常量 (类模板) |
标准提供 std::integral_constant 对类型 bool 的两个特化:
在标头
<type_traits> 定义 | |
类型 | 定义 |
true_type
|
std::integral_constant<bool, true> |
false_type
|
std::integral_constant<bool, false> |
一元类型特征
一元类型特征可以用于在编译时查询类型的布尔属性。
所有这些类型特征都满足一元类型特征 (UnaryTypeTrait) ,每个类型特征的基特征都是 std::true_type 和 std::false_type 之一,取决于是否符合对应的条件。
基础类型类别 | |
在标头
<type_traits> 定义 | |
(C++11) |
检查类型是否为 void (类模板) |
(C++14) |
检查类型是否为 std::nullptr_t (类模板) |
(C++11) |
检查类型是否为整数类型 (类模板) |
(C++11) |
检查类型是否是浮点类型 (类模板) |
(C++11) |
检查类型是否是数组类型 (类模板) |
(C++11) |
检查类型是否是枚举类型 (类模板) |
(C++11) |
检查类型是否为联合体类型 (类模板) |
(C++11) |
检查类型是否非联合类类型 (类模板) |
(C++11) |
检查类型是否为函数类型 (类模板) |
(C++11) |
检查类型是否为指针类型 (类模板) |
(C++11) |
检查类型是否为左值引用 (类模板) |
(C++11) |
检查类型是否为右值引用 (类模板) |
(C++11) |
检查类型是否为指向非静态成员对象的指针 (类模板) |
(C++11) |
检查类型是否为指向非静态成员函数的指针 (类模板) |
复合类型类别 | |
在标头
<type_traits> 定义 | |
(C++11) |
检查类型是否是基础类型 (类模板) |
(C++11) |
检查类型是否为算术类型 (类模板) |
(C++11) |
检查类型是否为标量类型 (类模板) |
(C++11) |
检查类型是否是对象类型 (类模板) |
(C++11) |
检查是否为复合类型 (类模板) |
(C++11) |
检查类型是否为左值引用或右值引用 (类模板) |
(C++11) |
检查类型是否为指向非静态成员函数或对象的指针类型 (类模板) |
类型属性 | |
在标头
<type_traits> 定义 | |
(C++11) |
检查类型是否为 const 限定 (类模板) |
(C++11) |
检查类型是否为 volatile 限定 (类模板) |
(C++11) |
检查类型是否平凡 (类模板) |
(C++11) |
检查类型是否可平凡复制 (类模板) |
(C++11) |
检查类型是否为标准布局类型 (类模板) |
(C++11)(C++20 中弃用) |
检查类型是否为简旧数据(POD)类型 (类模板) |
(C++11)(C++17 中弃用)(C++20 中移除) |
检查类型是否为字面类型 (类模板) |
检查是否该类型对象的每一位都对其值有贡献 (类模板) | |
(C++11) |
检查类型是否为类(但非联合体)类型且无非静态数据成员 (类模板) |
(C++11) |
检查类型是否为多态类类型 (类模板) |
(C++11) |
检查类型是否为抽象类类型 (类模板) |
(C++14) |
检查类型是否为 final 类类型 (类模板) |
(C++17) |
检查类型是否聚合类型 (类模板) |
(C++23) |
检查类型是否为隐式生存期类型 (类模板) |
(C++11) |
检查类型是否为有符号算术类型 (类模板) |
(C++11) |
检查类型是否为无符号算术类型 (类模板) |
(C++20) |
检查类型是否为有已知边界的数组类型 (类模板) |
(C++20) |
检查类型是否为有未知边界的数组类型 (类模板) |
(C++23) |
检查类型是否为有作用域枚举类型 (类模板) |
受支持操作 | |
在标头
<type_traits> 定义 | |
(C++11)(C++11)(C++11) |
检查类型是否带有针对特定实参的构造函数 (类模板) |
检查类型是否有默认构造函数 (类模板) | |
(C++11)(C++11)(C++11) |
检查类型是否拥有复制构造函数 (类模板) |
(C++11)(C++11)(C++11) |
检查类型是否能从右值引用构造 (类模板) |
(C++11)(C++11)(C++11) |
检查类型是否拥有针对特定实参的赋值运算符 (类模板) |
(C++11)(C++11)(C++11) |
检查类型是否拥有复制赋值运算符 (类模板) |
(C++11)(C++11)(C++11) |
检查类型是否有拥有移动赋值运算符 (类模板) |
(C++11)(C++11)(C++11) |
检查类型是否拥有未被弃置的析构函数 (类模板) |
(C++11) |
检查类型是否拥有虚析构函数 (类模板) |
(C++17)(C++17)(C++17)(C++17) |
检查一个类型的对象是否能与同类型或不同类型的对象交换 (类模板) |
检查在直接初始化中引用是否绑定到临时对象 (类模板) | |
检查在复制初始化中引用是否绑定到临时对象 (类模板) |
属性查询
属性查询特征可以用于在编译时查询类型的整数属性。
所有这些类型特征都满足一元类型特征 (UnaryTypeTrait) ,每个类型特征的基特征都是 std::integral_constant<std::size_t, Value>,其中 Value 是对应属性的查询结果。
在标头
<type_traits> 定义 | |
(C++11) |
获取类型的对齐要求 (类模板) |
(C++11) |
获取数组类型的维数 (类模板) |
(C++11) |
获取数组类型在指定维度的大小 (类模板) |
类型关系
类型关系特征可以用于在编译时查询类型之间的关系。
所有这些类型特征都满足二元类型特征 (BinaryTypeTrait) ,每个类型特征的基特征都是 std::true_type 和 std::false_type 之一,取决于是否符合对应的条件。
在标头
<type_traits> 定义 | |
(C++11) |
检查两个类型是否相同 (类模板) |
(C++11) |
检查一个类型是是另一个类型的基类 (类模板) |
(C++26) |
检查一个类型是否是另一个类型的虚基类 (类模板) |
(C++11)(C++20) |
检查是否能转换一个类型为另一类型 (类模板) |
(C++20) |
检查两个类型是否布局兼容 (类模板) |
检查一个类型是否为另一类型的指针可互转换(起始)基类 (类模板) | |
检查类型能否以给定的实参类型调用(如同以 std::invoke) (类模板) |
类型变换
类型变换特征按照预定义对着将一个类型变换到另一个。
所有这些类型特征都满足变换特征 (TransformationTrait) 。
常性/易变性说明符 | |
在标头
<type_traits> 定义 | |
(C++11)(C++11)(C++11) |
从给定类型移除 const 和/或 volatile 限定符 (类模板) |
(C++11)(C++11)(C++11) |
添加 const 和/或 volatile 限定符到给定类型 (类模板) |
引用 | |
在标头
<type_traits> 定义 | |
(C++11) |
从给定类型移除引用 (类模板) |
(C++11)(C++11) |
向给定类型添加左值或右值引用 (类模板) |
符号修饰符 | |
在标头
<type_traits> 定义 | |
(C++11) |
使给定的整数类型有符号 (类模板) |
(C++11) |
使给定的整数类型无符号 (类模板) |
数组 | |
在标头
<type_traits> 定义 | |
(C++11) |
从给定数组类型移除一个维度 (类模板) |
(C++11) |
移除给定数组类型的所有维度 (类模板) |
指针 | |
在标头
<type_traits> 定义 | |
(C++11) |
移除给定类型的一层指针 (类模板) |
(C++11) |
对给定类型添加一层指针 (类模板) |
其他变换 | |
在标头
<type_traits> 定义 | |
(C++11)(C++23 中弃用) |
定义适于用作给定大小的类型的未初始化存储的类型 (类模板) |
(C++11)(C++23 中弃用) |
定义适于用作所有给定类型的未初始化存储的类型 (类模板) |
(C++11) |
实施当按值传递实参给函数时所进行的类型变换 (类模板) |
(C++20) |
将 std::remove_cv 与 std::remove_reference 结合 (类模板) |
(C++11) |
条件性地从重载决议移除函数重载或模板特化 (类模板) |
(C++11) |
基于编译时布尔值选择一个类型或另一个 (类模板) |
(C++11) |
确定一组类型的公共类型 (类模板) |
确定一组类型的公共引用类型 (类模板) | |
(C++11) |
获取给定枚举类型的底层整数类型 (类模板) |
(C++11)(C++20 中移除)(C++17) |
推导以一组实参调用一个可调用对象的结果类型 (类模板) |
(C++17) |
void 变参别名模板 (别名模板) |
(C++20) |
返回不更改的类型实参 (类模板) |
逻辑运算
逻辑运算符特征将逻辑运算符应用到其他类型特征上。
在标头
<type_traits> 定义 | |
(C++17) |
变参的逻辑与元函数 (类模板) |
(C++17) |
变参的逻辑或元函数 (类模板) |
(C++17) |
逻辑非元函数 (类模板) |
成员关系
在标头
<type_traits> 定义 | |
检查一个类型的对象是否与该类型的指定子对象指针可互转换 (函数模板) | |
(C++20) |
检查两个指定成员是否在两个指定类型中的公共起始序列中彼此对应 (函数模板) |
编译时有理数算术
标头 <ratio> 提供操作和存储编译时比值的类型和函数。
编译时整数序列
在标头
<utility> 定义 | |
(C++14) |
实现编译时整数数列 (类模板) |