條款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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章