2. traits

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

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

template<typename T>
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<typename Iterator>
struct iterator_traits
{
    typedef typename Iterator::value_type value_type;
};

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


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

4. Iterator_traits 偏特化

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

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

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

template<typename T>
struct iterator_traits<const T*>
{
    typedef T value_type;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。