Traits程式設計技法

2021-10-01 05:33:10 字數 1126 閱讀 5203

照順序,這次應該是迭代器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 當我們使...