type_traits(类型萃取机)

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函数。

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top