[C++从进阶到入门] —— __type_traits

554 阅读1分钟

本文介绍__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源码剖析》