Metaprogramming library (since C++11)
C++提供了元编程设施,例如类型特征、编译时有理数运算和编译时整数序列。
目录 |
定义
以下类型统称为 referenceable types :
对于任何可引用类型
T
,都可以创建其引用
[1]
。
- ↑ 对于引用类型,这可以通过 reference collapsing 实现。
类型特征
类型特征定义了基于模板的编译时接口,用于查询类型的属性。
尝试特化定义于 <type_traits> 头文件且在本页列出的模板会导致未定义行为,但 std::common_type 和 std::basic_common_reference (C++20 起) 可根据描述要求进行特化。
定义在 <type_traits> 头文件中的模板可以被不完整类型实例化,除非另有说明,尽管通常禁止使用不完整类型实例化标准库模板。
基类
大多数非变换类型特征需要公开且明确地继承自 std::integral_constant ,以满足 UnaryTypeTrait 或 BinaryTypeTrait 的要求。
|
定义于头文件
<type_traits>
|
|
|
(C++11)
(C++17)
|
具有指定值和指定类型的编译期常量
(类模板) |
针对类型 bool 提供了 std::integral_constant 的两种特化:
|
定义于头文件
<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)
|
检查类型是否为
lvalue reference
(类模板) |
|
(C++11)
|
检查类型是否为
右值引用
(类模板) |
|
(C++11)
|
检查类型是否为非静态成员对象指针
(类模板) |
|
(C++11)
|
检查类型是否为非静态成员函数指针
(类模板) |
复合类型分类 |
|
|
定义于头文件
<type_traits>
|
|
|
(C++11)
|
检查类型是否为基本类型
(类模板) |
|
(C++11)
|
检查类型是否为算术类型
(类模板) |
|
(C++11)
|
检查类型是否为标量类型
(类模板) |
|
(C++11)
|
检查类型是否为对象类型
(类模板) |
|
(C++11)
|
检查类型是否为复合类型
(类模板) |
|
(C++11)
|
检查类型是否为
lvalue reference
或
rvalue reference
(类模板) |
|
(C++11)
|
检查类型是否为指向非静态成员函数或对象的指针
(类模板) |
类型属性 |
|
|
定义于头文件
<type_traits>
|
|
|
(C++11)
|
检查类型是否具有const限定符
(类模板) |
|
(C++11)
|
检查类型是否具有 volatile 限定符
(类模板) |
|
(C++11)
(deprecated in C++26)
|
检查类型是否为平凡类型
(类模板) |
|
(C++11)
|
检查类型是否为可平凡复制的
(类模板) |
|
(C++11)
|
检查类型是否为
standard-layout
类型
(类模板) |
|
(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++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)
|
为给定类型添加
lvalue
或
rvalue
引用
(类模板) |
符号修饰符 |
|
|
定义于头文件
<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)
(removed in C++20)
(C++17)
|
推导调用可调用对象时带一组实参的结果类型
(类模板) |
|
(C++17)
|
void 可变参数别名模板
(别名模板) |
|
(C++20)
|
返回未修改的类型参数
(类模板) |
逻辑运算 (始于 C++17)
逻辑运算符特征将逻辑运算符应用于其他类型特征。
|
定义于头文件
<type_traits>
|
|
|
(C++17)
|
变参逻辑与元函数
(类模板) |
|
(C++17)
|
变参逻辑或元函数
(类模板) |
|
(C++17)
|
逻辑非元函数
(类模板) |
成员关系 (since C++20)
|
定义于头文件
<type_traits>
|
|
|
检查类型的对象是否与该类型的指定子对象
指针可互转换
(函数模板) |
|
|
(C++20)
|
检查两个指定成员在两种指定类型的公共初始序列中是否彼此对应
(函数模板) |
编译期有理数运算
头文件 <ratio> 提供 用于操作和存储编译期比率值的类型和函数 。
编译期整数序列 (since C++14)
|
定义于头文件
<utility>
|
|
|
(C++14)
|
实现编译期整数序列
(类模板) |