您的位置:首页 > 大数据 > 人工智能

条款47:请使用traits classes 表现类型信息

2015-09-28 17:57 417 查看
/*条款47:请使用traits classes 表现类型信息*/
//Traits 是一种技术,一个C++程序员共同遵守的协议,它的要求之一是:它对内置类型和用户自定义类型的表现必须一样好
//advance 用来将某个迭代器移动某个给定距离
#include<iostream>
using namespace std;
template<typename IterT,typename DistT>
void advance(IterT &iter,DistT d);//但stl中有不同类型的迭代器,所以操作方法不同,需要对接受的不同类型分别做处理
/*
template<typename IterT,typename DistT>
void anvance(IterT&iter,DistT d){
if(iter is random access iterator){//处理不同类型的迭代器
iter+=d;
}
else {
if(d>=0){
while(d--)
++iter;
}
else {
while(d++)
--iter;
}
}
}
// 我们需要取得迭代器类型的某些信息,那就是traits让你得以进行的事,它们允许你在编译期间取得某些类型信息,类取得类型内的嵌套信息在内置类型这里就不行了(因为我们无法将信息嵌套于原始指针内),所以traits信息必须位于类型自身之外,标准技术是把它放进一个template及其一或多个特化版本中,这样的template在标准程序库中有若干个,其中针对迭代器者被命名为iterator_traits:
tempalte<typename IterT>
struct iterator_traits;// 迭代器分类的相关信息
iterater的动作方式是,针对每一个类型IterT,在struct iterator_traits<IterT>内一定声明某个typedef名为iterator_category,用它来确认迭代器的分类
//例如deque的迭代器可随机访问,所以针对deque迭代器而设计的class看起来像这样
template<..>
class deque{
public:
class iterator{
public:
typedef random_access_iterator_tag iterator_category;
//..
}
//...
};
//list 版本
template<..>
class list{
public:
class iterator{
public:
typedef bidirectional_iterator_tag iterator_category;
//..
}
//...
};
//那么实际的iterator_traits 是这样的
template<typename IterT>
struct iterator_traits{
typedef typename IterT::iterator_category iterator_category;
//.....
//这种方法只对自定义类型有效,那么此类也为指针类型提供了一个偏特化版本如下 :
}
template<typename IterT>
struct iterator_traits<IterT*>{
typedef random_access_iterator_tag iterator_category;
//.....
}
//然后把各类不同参数的advance 进行重载 
tempalte<typename IterT,typename DistT>
void doAdvance(IterT&iter,DistT d,std::random_access_iterator_tag){
<span style="white-space:pre">	</span>iter+=d;
}
tempalte<typename IterT,typename DistT>
void doAdvance(IterT&iter,DistT d,std::bidirectional_iterator_tag){
<span style="white-space:pre">	</span>if(d>=0){
<span style="white-space:pre">		</span>while(d++)
<span style="white-space:pre">			</span>--iter;
<span style="white-space:pre">	</span>}
tempalte<typename IterT,typename DistT>
void doAdvance(IterT&iter,DistT d,std::input_iterator_tag){
<span style="white-space:pre">	</span>if(d<0){
<span style="white-space:pre">		</span>throw std::out_of_range("Negative distance");<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>while(d--)
<span style="white-space:pre">		</span>++iter;
*/
int main(){

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