元编程基础(二):type_traits
概述
type_trait在C++11之后引入,使用头文件<type_traits>
获取相应功能。该头文件定义了一系列类来获取编译时的类型信息。
主要包括:
- Helper classes: 帮助创建编译时常量的标准类。
- Type traits: 以编译时常量值的形式获取类型特征的类。
-
Type transformations: 通过对现有类型应用特定转换来获得新类型的类。
c++的类型大概有如下几类:
类型表.png
示例
下面我们看一段代码:
#include <iostream>
#include <type_traits>
int main() {
std::remove_reference<int&>::type h1 = 3;
std::remove_reference_t<int&> h2 = 4;
int h3 = 5;
std::cout << h1 << " " << h2;
}
remove_reference
将int & 转换为int 类型,并声明变量h1; remove_reference_t
实现了相同的功能。特别的,从下图的汇编的代码中,我们可以看到h1,h2,h3均对应一个DWORD(2字节的字)
通常,编写泛型代码会使用这个库进行类型变换。
类型变换
常-易变性说明符
remove_cv remove_const remove_volatile (C++11)
从给定类型移除 const 或/与 volatile 限定符
add_cv add_const add_volatile (C++11)
添加 const 或/与 volatile 限定符到给定类型
引用
remove_reference (C++11) ```` 从给定类型移除引用
add_lvalue_referenceadd_rvalue_reference (C++11)``` 向给定类型添加左值或右值引用
指针
remove_pointer (C++11)
移除给定类型的一层指针
add_pointer (C++11)
对给定类型添加一层指针
符号修饰符
make_signed (C++11)
使给定的整型类型有符号
make_unsigned (C++11)
使给定的整型类型无符号
数组
remove_extent (C++11)
从给定数组类型移除一个维度
remove_all_extents (C++11)
移除给定数组类型的所有维度
杂项变换
aligned_storage
定义适于用作给定大小的类型的未初始化存储的类型