元编程库

< cpp

C++ 提供元编程设施,诸如类型特性、编译时有理数算术,以及编译时整数序列。

类型属性

这些类型特性定义编译时基于模板的接口,以查询类型的属性。

试图特化定义于 <type_traits> 头文件且描述于本节的模板导致未定义行为。

除非另外有指定,可以用不完整类型实例化定义于 <type_traits> 头文件的模板,尽管通常禁止以不完整类型实例化标准库模板。

定义于头文件 <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)
检查是否为复合类型
(类模板)
(C++11)
检查类型是否为左值引用右值引用
(类模板)
检查类型是否为指向非静态成员函数或对象的指针类型
(类模板)
类型属性
(C++11)
检查类型是否为 const 限定
(类模板)
(C++11)
检查类型是否为 volatile 限定
(类模板)
(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++11)
检查类型是否为有符号算术类型
(类模板)
(C++11)
检查类型是否为无符号算术类型
(类模板)
检查类型是否为有已知边界的数组类型
(类模板)
检查类型是否为有未知边界的数组类型
(类模板)
(C++23)
检查类型是否为有作用域枚举类型
(类模板)
受支持操作
检查类型是否带有针对特定实参的构造函数
(类模板)
检查类型是否有默认构造函数
(类模板)
检查类型是否拥有复制构造函数
(类模板)
检查类型是否能从右值引用构造
(类模板)
检查类型是否拥有针对特定实参的赋值运算符
(类模板)
检查类型是否拥有复制赋值运算符
(类模板)
检查类型是否有拥有移动赋值运算符
(类模板)
检查类型是否拥有未被弃置的析构函数
(类模板)
检查类型是否拥有虚析构函数
(类模板)
检查一个类型的对象是否能与同类型或不同类型的对象交换
(类模板)
属性查询
(C++11)
获取类型的对齐要求
(类模板)
(C++11)
获取数组类型的维数
(类模板)
(C++11)
获取数组类型在指定维度的大小
(类模板)
类型关系
(C++11)
检查两个类型是否相同
(类模板)
(C++11)
检查一个类型是否派生自另一个类型
(类模板)
检查是否能转换一个类型为另一类型
(类模板)
检查类型能否以给定的实参类型调用(如同以 std::invoke
(类模板)
检查在直接初始化中引用是否绑定到临时对象
(类模板)
检查在复制初始化中引用是否绑定到临时对象
(类模板)
检查二个类型是否布局兼容
(类模板)
检查一个类型是否为另一类型的指针可互转换(起始)基类
(类模板)
检查一个类型的对象是否与该类型的指定子对象指针可互转换
(函数模板)
检查二个指定成员是否在二个指定类型中的公共起始序列中彼此对应
(函数模板)

特性上的运算

定义于头文件 <type_traits>
(C++17)
变参的逻辑与元函数
(类模板)
(C++17)
变参的逻辑或元函数
(类模板)
(C++17)
逻辑非元函数
(类模板)

基类

定义于头文件 <type_traits>
具有指定值的指定类型的编译期常量
(类模板)

标准提供 std::integral_constant 对类型 bool 的二个特化:

定义于头文件 <type_traits>
类型 定义
true_type std::integral_constant<bool, true>
false_type std::integral_constant<bool, false>

类型修改

这些类型特性应用到模板参数的修改,并(有时条件性地)声明成员 typedef type 为结果类型。

试图特化定义于 <type_traits> 头文件且描述于本节的模板导致未定义行为,除了可以按描述要求特化 std::common_type std::basic_common_reference (C++20 起)

除非另外有指定,可以用不完整类型实例化定义于 <type_traits> 头文件的模板,尽管通常禁止以不完整类型实例化标准库模板。

定义于头文件 <type_traits>
常-易变性指定器
(C++11)(C++11)(C++11)
从给定类型移除 const 或/与 volatile 限定符
(类模板)
(C++11)(C++11)(C++11)
添加 const 或/与 volatile 限定符到给定类型
(类模板)
引用
从给定类型移除引用
(类模板)
向给定类型添加左值右值引用
(类模板)
指针
(C++11)
移除给定类型的一层指针
(类模板)
(C++11)
对给定类型添加一层指针
(类模板)
符号修改器
(C++11)
使给定的整数类型有符号
(类模板)
(C++11)
使给定的整数类型无符号
(类模板)
数组
(C++11)
从给定数组类型移除一个维度
(类模板)
移除给定数组类型的所有维度
(类模板)

杂项变换

定义于头文件 <type_traits>
(C++11)(C++23 中弃用)
定义适于用作给定大小的类型的未初始化存储的类型
(类模板)
(C++11)(C++23 中弃用)
定义适于用作所有给定类型的未初始化存储的类型
(类模板)
(C++11)
实施当按值传递实参给函数时所进行的类型变换
(类模板)
(C++20)
std::remove_cvstd::remove_reference 结合
(类模板)
(C++11)
条件性地从重载决议移除函数重载或模板特化
(类模板)
(C++11)
基于编译时布尔值选择一个类型或另一个
(类模板)
(C++11)
确定一组类型的公共类型
(类模板)
确定类型组的共用引用类型
(类模板)
(C++11)
获取给定枚举类型的底层整数类型
(类模板)
(C++11)(C++20 中移除)(C++17)
推导以一组实参调用一个可调用对象的结果类型
(类模板)
(C++17)
void 变参别名模板
(别名模板)
(C++20)
返回不更改的类型实参
(类模板)

编译时有理数算术

头文件 <ratio> 提供操作和存储编译时比例的类型和函数

编译时整数序列

定义于头文件 <utility>
实现编译时整数数列
(类模板)