Type Traits即类型属性。C++类型本身不具有某些我们感兴趣的属性信息,例如(拷贝)构造、析构函数,以及赋值运算符是否Trival,所以我们应当采用某些手段来记录这些信息。这些信息有助于针对某种类型选择最佳的方法。当然我们也可以在类中添加字段来记录这些信息,但这样一来增加了类的负担,二来只能在运行时访问,影响效率。最好的方式当然是在编译时刻就能确定。
先给出SGI STL中__type_traits的定义(这是一个模板,可以针对各种类型进行特化):
template <class _Tp>
struct __type_traits {
typedef __true_type this_dummy_member_must_be_first;
typedef __false_type
has_trivial_default_constructor;
typedef __false_type has_trivial_copy_constructor;
typedef __false_type has_trivial_assignment_operator;
typedef __false_type has_trivial_destructor;
typedef __false_type is_POD_type;
};
其中:
Struct __true_type{};
Struct __false_type{};
下面我们将讲述__type_traits在编程过程中的应用:
假如一个函数Function接受类型为T的参数,针对该参数的类型,我们选择适当的处理方法。
【首要的条件是已经存在__type_traits关于类型T的特化版本,当然也可以用它的缺省版本。】
1. 建立该函数(Function)的两个辅助
重载“子函数”(Function_aux),这两个子函数不仅接受原来的T型函数,另外还接受一个参数,分别为__true_type或者__false_type类型的参数。【编译时就是靠这个附加参数来选择恰当的子函数。】
2. 获取T类型中我们感兴趣的类型信息。比如:
__type_taits<T>:: has_trivial_copy_constructor, 一般为了简便,我们会做一步typedef,
typedef typename __type_taits<T>:: has_trivial_copy_constructor isTrivalCtor;
__type_taits<T>:: has_trivial_copy_constructor, 一般为了简便,我们会做一步typedef,
typedef typename __type_taits<T>:: has_trivial_copy_constructor isTrivalCtor;
这样我们得到一个潜在的、可以为__true_type,也可以为__false_type的类型定义。
3. 在Function中调用子函数:
Function_aux( t, isTrivalCtor() )。【注意:最后这个参数带有“()”,这是没办法的办法,C++不能将类型作为变量使用,不像Python那么灵活。】。
最后这个参数是一个__true_type或者__false_type类型的对象。正是因为其类型不同,所以可以在编译时刻即确定应当选用的重载函数。