[TOC] # 概述 `iterator_traits`是萃取迭代器的特性,而`__type_traits`是萃取型别的特性。萃取的型别如下: - non-trivial default ctor? - non-trivial copy ctor? - non-trivial assignment operator? - non-trivial dtor? - POD(plain old data)型别? 其中`non-trivial`意指非默认的相应函数,编译器会为每个类构造以上四种默认的函数,如果没有定义自己的,就会用编译器默认函数,如果使用默认的函数,我们可以使用memcpy(),memmove(),malloc()等函数来加快速度,提高效率. 且`__iterator_traits`允许针对不同的型别属性在编译期间决定执行哪个重载函数而不是在运行时才处理, 这大大提升了运行效率. 这就需要STL提前做好选择的准备. 是否为POD, non-trivial型别用__true_type和__false_type 来区分. # 空间配置器 ``` template <class ForwardIterator, class T> inline void __destroy(ForwardIterator first, ForwardIterator last, T*) { typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor; __destroy_aux(first, last, trivial_destructor()); } // non-travial destructor template <class ForwardIterator> inline void __destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) { for ( ; first < last; ++first) destroy(&*first); } // travial destructor template <class ForwardIterator> inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {} ``` 上述代码可以看出__destroy利用__type_trits<T>::has_trivial_destructor判断是否有默认的虚构函数,如果有就会调用__destroy_aux(T,T,__true_type()),否则调用__destroy_aux(T,T,__false_type())函数,其中__false_type和__true_type是两个空类而不是bool,目的利用模板函数的参数推导,在编译期就决定需要调用哪个重载函数。