元编程库 (自 C++11)
C++ 提供了元编程工具,例如类型特征、编译时有理算术和编译时整数序列。
目录 |
[编辑] 定义
以下类型统称为可引用类型
对于任何可引用类型 T
,可以创建对它的引用[1]。
[编辑] 类型特征
类型特征定义了基于编译时模板的接口,用于查询类型的属性。
尝试特化在 <type_traits> 头文件中定义并在本页列出的模板会导致未定义的行为,但 std::common_type 和 std::basic_common_reference(自 C++20) 可以根据描述的需要进行特化。
在 <type_traits> 头文件中定义的模板可以使用不完整类型实例化,除非另有说明,尽管通常禁止使用不完整类型实例化标准库模板。
[编辑] 基类
大多数非转换类型特征需要公开且明确地派生自 std::integral_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++11)(DR*) |
检查类型是否为 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++26 中弃用) |
检查类型是否为平凡的 (类模板) |
(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。
Const-volatile 限定符 | |
定义于头文件
<type_traits> | |
(C++11)(C++11)(C++11) |
从给定类型中移除 const 和/或 volatile 限定符 (类模板) |
(C++11)(C++11)(C++11) |
向给定类型添加 const 和/或 volatile 限定符 (类模板) |
引用 | |
定义于头文件
<type_traits> | |
(C++11) |
从给定类型移除引用 (class template) |
(C++11)(C++11) |
向给定类型添加左值或右值引用 (class template) |
符号修饰符 | |
定义于头文件
<type_traits> | |
(C++11) |
获取给定整型类型对应的有符号类型 (class template) |
(C++11) |
获取给定整型类型对应的有符号类型 (class template) |
数组 | |
定义于头文件
<type_traits> | |
(C++11) |
从给定数组类型移除一个维度 (class template) |
(C++11) |
从给定数组类型移除所有维度 (class template) |
指针 | |
定义于头文件
<type_traits> | |
(C++11) |
从给定类型移除指针 (class template) |
(C++11) |
向给定类型添加指针 (class template) |
其他转换 | |
定义于头文件
<type_traits> | |
(since C++11)(deprecated in C++23) |
定义适合用作给定大小类型未初始化存储的类型 (class template) |
(since C++11)(deprecated in C++23) |
定义适合用作所有给定类型未初始化存储的类型 (class template) |
(C++11) |
应用类型转换,如同按值传递函数参数时一样 (class template) |
(C++20) |
组合 std::remove_cv 和 std::remove_reference (class template) |
(C++11) |
有条件地移除函数重载或模板特化,使其不参与重载决议 (class template) |
(C++11) |
基于编译时布尔值选择一个类型或另一个类型 (class template) |
(C++11) |
确定一组类型的公共类型 (class template) |
确定一组类型的公共引用类型 (class template) | |
(C++11) |
获取给定枚举类型的底层整数类型 (class template) |
(C++11)(removed in C++20)(C++17) |
推导使用一组参数调用可调用对象的结果类型 (class template) |
(C++17) |
void 可变参数别名模板 (alias template) |
(C++20) |
返回未更改的类型参数 (class template) |
[edit] 逻辑运算 (since C++17)
逻辑运算符特性将逻辑运算符应用于其他类型特性。
定义于头文件
<type_traits> | |
(C++17) |
可变参数逻辑与元函数 (class template) |
(C++17) |
可变参数逻辑或元函数 (class template) |
(C++17) |
逻辑非元函数 (class template) |
[edit] 成员关系 (since C++20)
定义于头文件
<type_traits> | |
检查某类型的对象是否与该类型的指定子对象指针可互转换 (function template) | |
(C++20) |
检查两个指定成员是否在两个指定类型的公共初始子序列中彼此对应 (function template) |
[edit] 编译时有理数算术
头文件 <ratio> 提供了用于操作和存储编译时有理数的类型和函数。
[edit] 编译时整数序列 (since C++14)
定义在头文件
<utility> | |
(C++14) |
实现编译时整数序列 (class template) |