SGI STL有一个内部使用的__type_traits,关注的是这个型别是否有non-trivail defalut ctor等函数,若没有复杂的这些函数,就可以使用最有效率的操作进行复制和移动。
template<class type>
struct __type_traits{
typedef __true_type this_dummy_member_must_be_first; //确保编译器也是用一个名为__type_traits而其实与此处定义并无任何关联的template时,任何事情都仍将顺利运作
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;
};
编译器只有面对class object形式的参数,才会做参数推导。
struct __true_type {};
struct __false_type {};
针对C++基本性别,都可以采用最快速方式来进行拷贝或赋值操作。所以设计的偏特化模板中,每一个成员的值都是__true_type.
uninitialized_fill_n函数的实现
template<class ForwardIterator, class Size, class T>
inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, const T &x){
return __uninitialized_fill_n(first, n, x, value_type(first)); //在迭代器的位置填充n个x值
}
template<class ForwardIterator, class Size, class T, class T1>
inline ForwardIterator __uninitialized_fill_n(ForwardIterator first, Size n, const T &x, T1*){
typedef typename __type_traits<T1>::is_POD_type is_POD; //萃取出T1的类型
return __uninitialized_fill_n_aux(first, n, x, is_POD());
}
template<class ForwardIterator, class Size, class T>
inline ForwardIterator __uninitialized_fill_n_aux(ForwardIterator first, Size n, const T &x, __false_type){
ForwardIterator cur = first;
for(; n > 0; --n, ++cur){
construct(&*cur, x); //使用placement new函数调用x的构造函数
}
return cur;
}
template<class ForwardIterator, class Size, class T>
inline ForwardIterator __uninitialized_fill_n_aux(ForwardIterator first, Size n, const T &x, __true_type){
return fill_n(first, n, x);
}
template<class OutputIterator, class Size, class T>
OutputIterator fill_n(OutputIterator first, Size n, const T &value){
for(; n > 0; --n, ++first){
*first = value; //直接复制
}
return first;
}
对于一个class什么时候该有自己的non_trivial default constructor…呢?一个简单的判断准则是:如果class内含指针成员,并且对它进行内存动态配置,那么这个class就需要实现自己的相关non-trivial函数。