step1.首先來寫一個(gè)模板函數(shù)實(shí)現(xiàn)獲得指針指向的值
template<class T>
T Get(T* t) {
return *t;
}
int main() {
cout << Get(new int(8));
}
這里針對(duì)的是基本類型
step2.針對(duì)自定義指針(迭代器)實(shí)現(xiàn)
template<class T>
class Iterator {
private:
T* p;
public:
Iterator(T* np):p(np) {}
T& operator*() {
return *p;
}
};
//因?yàn)镮terator看上去并不是一個(gè)指針昔期,所以不能用下面的形式
//template<class T>
//T Get(T* t) {
// return *t;
//}
//采用這種形式
template<class I>
? Get(I i) { //這里返回值不知道怎么寫了,這就是我們現(xiàn)在面臨的問題
return *i;
}
int main() {
Iterator<int> i(new int(2));
cout << Get(i) << endl;
}
現(xiàn)在的問題是如何獲得迭代器所指向的類型
step3.解決:在迭代器里指出值類型
template<class T>
class Iterator {
private:
T* p;
public:
typedef T valueType; //在這里指出valueType是 T
Iterator(T* np):p(np) {}
T& operator*() {
return *p;
}
};
template<class I>
typename I::valueType Get(I i) { //返回值類型到Iterator里去找
return *i;
}
int main() {
Iterator<int> i(new int(2));
cout << Get(i) << endl;
}
目前看上去問題已經(jīng)解決了
不過還有一些需要調(diào)整
目前返回值類型是通過在迭代器類里去找得到的佛玄,對(duì)于基本數(shù)據(jù)類型是不適用的
Get(new int(2)) 會(huì)出錯(cuò)
有兩個(gè)思路硼一,1.為Get函數(shù)增加處理基本類型的偏特化,2.添加一個(gè)中間層(traits)為我們指定返回值類型
兩個(gè)思路其實(shí)核心是一樣的梦抢,但是后者可以作為一個(gè)工具為其他多個(gè)方法所使用般贼,適用性更廣。
step4.traits
template<class T>
class Iterator {
private:
T* p;
public:
typedef T valueType;
Iterator(T* np):p(np) {}
T& operator*() {
return *p;
}
};
template<class I>
struct IteratorTraits {
typedef typename I::valueType valueType;
};
//偏特化
template<class T>
struct IteratorTraits<T*> {
typedef T valueType;
};
template<class I>
typename IteratorTraits<I>::valueType Get(I i) {
return *i;
}
int main() {
Iterator<int> i(new int(2));
cout << Get(i) << endl;
cout << Get(new int(8)) << endl;
}