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

来源:互联网 发布:python自动化性能测试 编辑:程序博客网 时间:2024/06/06 13:58

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;

0 0
原创粉丝点击