本文介绍__type_traits,阅读本文前,请确保你已经理解Traits编程技巧。
iterator_traits用于萃取迭代器特性,__type_traits用于萃取型别特性。型别特性指其是否具有无关紧要的构造析构等,对于其中无关紧要的部分可以直接处理内存如malloc()、memcpy()等提高效率。
template <class type>
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;
};
下面的value_type()可以方便的获取迭代器的value_type。
template <class Iterator>
inline typename iterator_traits<Iterator>::value_type* value_type(const Iterator&) {
return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
}
type_traits的使用,首先用value_type()获取迭代器所指型别T,接着使用typedef typename __type_traits<T>::is_POD_type is_POD;获取该迭代器所指对象是否为POD型别,接着使用is_POD()作为函数参数,对应__true_type和__false_type两个重载版本函数。
POD意指Plain Old Data,也就是标量型别(scalar types)或传统的C struct型别。POD型别必然拥有trivial ctor/dctor/copy/assignment operator函数。
type_traits.h内声明了所有C++标量型别的特化版本。而如果是我们自己定义的类,使用__type_traits萃取出的都是__false_type(很厉害的那种编译器除外,它可以自己判断是否有trivial函数),即使该类属于POD型别。解决办法是自行设计该类的__type_traits偏特化版本。
如何判断trivial函数?如果class内涵指针成员,就需要实现non-trivial函数。
本文内容参考 —— 《STL源码剖析》