Metaprogramming library (since C++11)
C++提供了元编程设施,例如类型特征、编译期有理数运算和编译期整数序列。
目录 |
定义
以下类型统称为 可引用类型 :
对于任何可引用类型
T
,都可以创建其引用
[1]
。
类型特征
类型特征定义了基于模板的编译时接口,用于查询类型的属性。
尝试对定义于 <type_traits> 头文件且在本页面列出的模板进行特化将导致未定义行为,但 std::common_type 和 std::basic_common_reference (since 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)
|
检查类型是否为
左值引用
(类模板) |
|
(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 中弃用)
</
|
|
支持的操作 |
|
|
定义于头文件
<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 要求。
常易变性限定符 |
|
|
定义于头文件
<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)
|
原样返回类型实参
(类模板) |
逻辑运算 (since C++17)
逻辑运算符特征将逻辑运算符应用于其他类型特征。
|
定义于头文件
<type_traits>
|
|
|
(C++17)
|
变参逻辑与元函数
(类模板) |
|
(C++17)
|
变参逻辑或元函数
(类模板) |
|
(C++17)
|
逻辑非元函数
(类模板) |
成员关系 (since C++20)
|
定义于头文件
<type_traits>
|
|
|
检查类型的对象是否与该类型的指定子对象
指针可互转换
(函数模板) |
|
|
(C++20)
|
检查两个指定成员在两种指定类型的公共初始子序列中是否相互对应
(函数模板) |
编译期有理数运算
头文件 <ratio> 提供了 用于操作和存储编译期比率 的类型和函数。
编译期整数序列 (since C++14)
|
定义于头文件
<utility>
|
|
|
(C++14)
|
实现编译时整数序列
(类模板) |