元编程库 (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,具体取决于是否满足相应的条件。
主要类型类别 (Primary type categories) | |
定义于头文件
<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) |
检查类型是否为非静态成员函数指针 (类模板) |
复合类型类别 (Composite type categories) | |
定义于头文件
<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) |
从给定类型中移除引用 (类模板) |
(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) |
返回不变的类型参数 (类模板) |
[编辑] 逻辑运算 (C++17 起)
逻辑运算符特性将逻辑运算符应用于其他类型特性。
定义于头文件
<type_traits> | |
(C++17) |
可变参数逻辑 AND 元函数 (类模板) |
(C++17) |
可变参数逻辑 OR 元函数 (类模板) |
(C++17) |
逻辑 NOT 元函数 (类模板) |
[编辑] 成员关系 (C++20 起)
定义于头文件
<type_traits> | |
检查一个类型的对象是否与该类型的指定子对象指针可互转 (函数模板) | |
(C++20) |
检查两个指定的成员是否在两个指定类型的共同初始子序列中相互对应 (函数模板) |
[编辑] 编译时有理算术
头文件 <ratio> 提供了 用于操作和存储编译时比率的类型和函数。
[编辑] 编译时整数序列 (C++14 起)
在头文件
<utility> 中定义 | |
(C++14) |
实现编译时整数序列 (类模板) |