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

/*条款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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值