type trait

type trait是一系列模板,描述了类型的特征,定义在<type_traits>。

类型判断

trait作用
is_void是否void
is_integral整数类型(包括bool、char、char16_t、char32_t、wchar_t)
is_floating_point浮点数类型
is_arithmetic整数(包括bool、char、char16_t、char32_t、wchar_t)或浮点数
is_signed带符号
is_unsigned不带符号
is_const带const限定符
is_volatile带volatile限定符
is_array普通数组
is_enum枚举
is_union联合
is_class类类型或结构体类型
is_function函数类型
is_reference引用
is_lvalue_reference左值引用
is_rvalue_reference右值引用
is_pointer指针类型,包括函数指针,不包括指向nonstatic成员的指针
is_member_pointer指向nonstatic成员的指针
is_member_object_pointer指向nonstatic数据成员的指针
is_member_funciton_pointer指向nonstatic成员函数的指针
is_fundamentalvoid、整数类型(包括bool、char、char16_t、char32_t、wchar_t)、浮点数、nullptr_t
is_scalar整数类型、浮点数、枚举、pointer、member pointer、nullptr_t
is_object任何类型,除了void、funciton和reference
is_compound普通数组 、枚举、联合、class、function、reference、pointer
is_trivialScalar、trivially copyable class 或那些类型构成的array
is_trivially_copyableScalar、trivially copyable class 或那些类型构成的array
is_standard_layoutScalar、standard layout class 或那些类型构成的array
is_pod
is_literal_typeScalar、reference、class或那些类型构成的数组

class类型特征判断

trait作用
is_emptyclass不带任何成员、virtual 成员函数或 virtual base data
is_polymorphicclass带有一个 virtual 成员函数
is_abstract抽象类
has_virtual_destructor带有虚析构函数
is_default_constructible能完成默认构造
is_copy_constructible能完成复制构造
is_move_constructible能完成移动构造
is_copy_assignable能完成复制语义赋值
is_move_assignable能完成移动语义赋值
is_destructible带可被调用析构函数(不可以是deleted、protected、private)
is_trivially_default_constructible能完成trivial 默认构造
is_trivially_copy_constructible能完成 trivial 复制构造
is_trivially_move_constructible能完成trivial 移动构造
is_trivially_copy_assignable能完成trivial 赋值
is_trivially_move_assignable能完成trivial 移动语义赋值
is_trivially_destructible带有可被调用的trivial 析构函数
is_nothrow_default_constructible能完成不抛出异常的默认构造
is_nothrow_copy_constructible能完成不抛出异常的复制构造
is_nothrow_move_constructible能完成不抛出异常的移动构造
is_nothrow_copy_assignable能完成不抛出异常的赋值
is_nothrow_move_assignable能完成不抛出异常的移动语义赋值
is_nothrow_destructible带可被调用不抛出异常的析构函数

判断类型的关系

trait作用
is_same<T1,T2>T1和T2是不是相同类型
is_base_of<T,D>T是不是D的基类
is_convertible<T1,T2>T1是否可以转换为T2
is_constructible<T,Ags…>T是否可以用Args…中的类型构造
is_trivially_constructible<T,Args…>T是否可以用Args中的类型trivially构造
is_nothorw_constructible<T,Arts…>T是否可以用Args中类型构造且不抛出异常
is_assignable<T1,T2>是否可用T2对T1进行赋值
is_nothrow_assignable<T1,T2>是否可用T2对T1进行赋值且不抛出异常
uses_allocator<T,Alloc>Alloc是否可转换为T::allocator_type

值得注意,上述的trait中 T 是被视作右值的。对于基础内置数据类型,使用内置赋值操作符是不能对右值赋值的,所以类似 is_assignable<int,int>::value的结果总是false。但是,对于类类型,赋值操作是使用其成员函数,而且类类型的右值可以调用成员函数,所以 is_assignable<string,string>::value 结果是true。

改变类型

trait作用
remove_const移除const
remove_volatile移除 volatile
remove_cv移除 const 和 volatile
add_const添加const
add_volatile添加 volatile
add_cv添加 const 和 volatile
make_signed转为对应带符号 nonreference 类型
make_unsigned转为对应的不带符号 nonreference 类型
remove_reference移除引用
add_lvalue_reference添加左值引用(右值变为左值)
add_rvalue_reference添加右值引用(左值保持左值)
remove_pointer转为指针指向的类型(不是指针返回原类型)
add_pointer转为指针类型,指向对应的nonreference类型

其他type trait

trait作用
rank获取数组类型的维度
extent<T,I=0>维度 I 的宽度
remove_extent获取数组的元素类型,如果 T 不是数组则获得 T
remove_all_extents获取多维数组的元素类型,如果 T 不是多维数组则获得 T
underlying_type枚举类型的底层类型
decay将 T 转换为对应的实值类型
enable_if<B, T=void>B 为 true 时返回 T
condition<B, T, F>B 为 true 时 返回 T, 否则返回 F
common_type<T1,…>返回所有传入类型的共通类型
result_of<F, ArgTypes>返回调用 F 的返回类型, ArgTypes 为 F 的实参类型
alignment_of等价于 alignof(T)
aligned_storage
aligned_storage<Len, Align>
aligned_union<Len, Types…>

common_type<> trait 会返回所有传入类型的共通类型,所谓的共通类型可以理解为,其它类型都可以通过隐式类型转换 转换为它。对于内置数值类型,隐式类型转换总是从低精度到高精度,所以 common_type<> 应用于内置数值类型时,总是返回高精度的类型。
查找共通类型的功能实际是三目运算符 :? 提供,它的返回值带有类型,就是共通类型。如果三目运算符的操作数不存在共通类型,就会提示编译错误 “操作数类型不兼容”。因为 :? 日常使用通常应用于相同类型,所以会忽略了 :? 这一特性:

double d = 9.0;
std::cout << typeid(true ? 1 : d).name() << std::endl;		// 输出 double
std::cout << typeid(true ? 1 : "d").name() << std::endl;	// error

common_type<>的实现类似:

template <typename T1, typename T2>
struct common_type<T1, T2>
{
	typedef decltype(true ? declval<T1>() :: declval<T2>()) type;
}

reference wrapper(外覆器)

reference wrapper的一个用途是给函数模板的参数赋予引用属性。对于类型 T,ref()把类型转换为 T&,cref() 把类型转换为 const T&。这允许了函数模板不用提供针对引用参数的的特化版本:

template <typename T>
void foo(T val);

int x;
foo(ref(x));
foo(cref(x));

标准库中的 make_pair<>、make_tuple()、Binder 和 Thread 都使用了这特性。

function type wrapper

function<>可以把C++的可调用对象,如函数、函数对象、lambda表达式等封装:

void sayhello()
{
	std::cout << "hello" << std::endl;
}

function<void()> func(sayhello);
func();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值