2. traits

引用《STL源码剖析》的话说,traits是用来获取迭代器指向的数据类型。

1. 为迭代器增加内嵌数据类型

template
class Iterator
{
public:
    typedef T value_type;//内嵌类型声明
    Iterator(T *p = 0) : m_ptr(p) {}
    T& operator*() const { return *m_ptr;}
    //...
 
private:
    T *m_ptr;
};

2. 定义 Iterator_traits

template
struct iterator_traits
{
    typedef typename Iterator::value_type value_type;
};

3. 使用Iterator_traits 获取迭代器指向的数据类型


template
typename Iterator::value_type  //这行是返回类型
func(Iterator iter)
{
    return *iter;
}
 
//通过iterator_traits作用后的版本
template
typename iterator_traits::value_type  //这行是返回类型
func(Iterator iter)
{ 
    return *iter;
}

4. Iterator_traits 偏特化

由于原生指针也是一种迭代器,但是raw pointer是没有内嵌类型的。所以对于raw pointer进行特殊处理,也就是偏特化。使得raw pointer也支持iterator_traits。

定义iterator_traits的原生指针偏特化版本。

//iterator_traits的偏特化版本,针对迭代器是个原生指针的情况
template
struct iterator_traits
{
    typedef T value_type;
};

template
struct iterator_traits
{
    typedef T value_type;
}

你可能感兴趣的:(2. traits)