元编程库 (自 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) |
检查类型是否为常量限定 (类模板) |
(C++11) |
检查类型是否为易变限定 (类模板) |
(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) |
检查类型是否为最终类类型 (类模板) |
(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.
Const-volatility 说明符 | |
在头文件
<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) |
可变参数逻辑 AND 元函数 (类模板) |
(C++17) |
可变参数逻辑或元函数 (类模板) |
(C++17) |
逻辑非元函数 (类模板) |
[编辑] 成员关系
在头文件
<type_traits> 中定义 | |
检查类型对象的指针是否可以与该类型指定子对象互换 (函数模板) | |
(C++20) |
检查两个指定成员在两个指定类型的公共初始子序列中是否相互对应 (函数模板) |
[编辑] 编译时有理数运算
头文件 <ratio> 提供 用于操作和存储编译时比率的类型和函数.
[编辑] 编译时整数序列
定义于头文件
<utility> | |
(C++14) |
实现编译时整数序列 (类模板) |