学习STL过程中的一些零散记录4

Traits编程技法:

1.要识别迭代器所指对象的类型,即所谓迭代器的value_type,可用模板参数推导机制推导出,但有其局限性,如无法推导出函数的返回值类型。

2.更好的方法是声明内嵌类型,如:

template<class T>

struct MyIter{

typedef T value_type;

T* ptr;

MyIter(T* p=0):prt(p){};

T& operator * () const {return *ptr;};

}


template<class I>

typename I::value_type//返回值类型,必须加typename,因为I::value_type是一个模板参数,在他被编译器具现化前编译器对他一无所知,typename告诉编译器这//是一个类型

func(I iter){

retrun *iter;

}


int main(){

MyIter<int> iter(new int(8));

func(iter);

retrun 0;

}

这里有一个隐晦的陷阱:并不是所有的迭代器都是class type的,如原始指针就不是。不是class type那么我们就不能使用声明内嵌类型了;

3.模板偏特化的意义:

a.偏特化的定义:针对(任何)模板参数更进一步的条件限制所设计出的一个特化版本,如template<class T> class AA{...};的一个特化版本template<class T> classAA<T*> {...}; 

b.萃取迭代器的特性,如下面这个类模板专门用来萃取迭代器的特性:

template<class I>

struct iterator_traits{

typedef typename I::value_type value_type;

};

所谓萃取是指如果I定义有自己的value_type,则这个类模板萃取出的value_type就是I的value_type。

c.iterator_traits通过偏特化萃取原始指针的类型:

template<class T>

struct iterator_traits<T*>{

typedef T value_type;

}



阅读更多
想对作者说点什么? 我来说一句

Qt日常积累的编程零散知识

2018年04月18日 86KB 下载

一些零散学习VB DATA

2008年06月16日 24KB 下载

java的一些零散记录

原文地址

reed1991 reed1991

2016-11-17 18:50:29

阅读数:157

没有更多推荐了,返回首页

不良信息举报

学习STL过程中的一些零散记录4

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭