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