照順序,這次應該是迭代器iterator的內容了,然而iterator涉及到乙個重要的技巧就是traits程式設計技法。
在使用iterator時,可能需要知道它的相應型別,也就是iterator指向的變數的型別,在c/c++語言中,如果要獲取乙個變數的大小可以使用sizeof()操作符。然而如果想要獲取乙個指標指向的變數型別該如何做呢,可惜它沒有乙個typeof()操作符供我們程式設計師使用。
利用template的引數/引數推導(argument deducation)是乙個解決問題的好方法,僅將func函式作為乙個包裝,而把實際的操作放在乙個函式func_impl裡面完成。一旦func()函式被呼叫,編譯器就自動進行引數推導,自動匯出型別t。
#include using namespace std;
templatevoid func_imp(point iter, t value)
templatevoid func(point iter)
int main()
現在解決了從指標中獲取原資料型別的方法,型別的的確確是獲取到了,但要將型別作為乙個函式的返回型別呢?有沒有什麼辦法提前獲取到型別呢,這就需要traits程式設計技法了。
採用nested type(巢狀型別)似乎是個不錯的注意,如下所示:
templateclass iterator
t& operator*()const
};templatetypename i::value_type func2(i iter)
int main()
首先構建iterator類,獲取型別的方法和上文直接用兩層函式的方法相似。這裡func2函式的返回值前加上了乙個typename,這是因為在template t例項化之前,編譯器對t一無所知,並不知道iterator::value_type代表的是乙個函式,變數還是型別。關鍵字typename就是告訴編譯器說這是乙個型別,以使得編譯通過。
看起來不錯,但是這裡還有乙個隱晦的陷阱:並不是所有的迭代器都有value_type,編譯器內嵌型別(原生指標)就沒有,這樣編譯就不能通過,但是stl必須接受原生指標作為一種迭代器,這需要另外的技巧,它就是模板偏特化(template partial specialization)。
traits程式設計技法
iterator模式定義如下 提供一種方法,是指能夠依次序尋訪某個聚合物 容器 所含的各個元素,而又無需暴露該聚合物的內部表達。迭代器是一種智慧型指標 迭代器最重要的程式設計工作就是對opertor 和operator 進行過載工作。在演算法中運用迭代器時,很可能會用到其相應型別。利用functio...
STL之traits程式設計技法
traits程式設計技法利用了 內嵌型別 的程式設計技巧與編譯器的template引數推導功能。下面主要看看利用traits程式設計技法實現的迭代器萃取機制。5種迭代器型別定義 struct input iterator tag struct output iterator tag struct f...
STL中,traits程式設計技法 模板
stl中,traits程式設計技法得到了很大的應用,了解這個,才能一窺stl奧妙所在。先將自己所理解的記錄如下 traits技術可以用來獲得乙個 型別 的相關資訊的。首先假如有以下乙個泛型的迭代器類,其中型別引數 t 為迭代器所指向的型別 template class myiterator 當我們使...