您的位置:首页 > 编程语言

第三章 迭代器与trait编程技巧

2014-11-25 18:43 363 查看
Trait所扮演的角色是特性萃取机的角色,萃取各个迭代器的特性,为了使trait特性有效运作,每一个迭代器必须遵循约定,自行以内嵌型别定义的方式定义出相应型别。根据编译器利用function template的参数推导机制,确定型别。(利用该机制解决参数返回值的型别定义)

template<class Category,class T , class Distance=ptrdiff_t,class Pointer=T*,class Reference=T&>

struct iterator{ //使用可以看后面的Vector

typedef Category iterator_ategory;

typedef T value_type;

typedef Distance difference_type;

typedef Pointer pointer;

typedef Reference reference;

};

template<class Iterator>

struct iterator_traits{ //萃取特性 定义结构方便使用

typedef typename Iterator:: iterator_ategory iterator_ategory;

typedef typename Iterator::value_type value_type;

typedef typename Iterator:: difference_type difference_type;

typedef typename Iterator:: pointer pointer;

typedef typename Iterator::reference reference;

};

typename 用意在于告诉编译器这是一个型别,因为在此之前编译器并不知道iterator<T>::value_type代表的是一个型别或者是member function或者是一个data member.

使用方法:

Iterator_traits<int>::value_type ......

由于并非是所有迭代器都是class type,原生指针就不是,就有偏特化版本引出

template<T>

struct iterator_traits<T*>{

typedef radom_access_iterator_tag iterator_ategory;

typedef T value_type;

typedef ptrdiff_t difference_type;

typedef const T* pointer;

typedef const T& reference;

};

template<T>

struct iterator_traits<T*>{

typedef radom_access_iterator_tag iterator_ategory;

typedef T value_type;

typedef ptrdiff_t difference_type;

typedef T* pointer;

typedef T& reference;

};

迭代器的五种分类:

Input Iterator,Output Iterator,Forward Iterator ,Bidirection Iterator,Random Access Iterator;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: