接著了解c++中的traits技術。
traits技術可以獲取乙個型別的相關資訊。
比如針對乙個泛型迭代器,型別引數t表示迭代器所指向的型別。
template < typename t>
class cmyiterator
;
我們使用這個迭代器時,如何才能知道這個迭代器所指向元素的型別呢?
比如我們可以為這個類加入乙個內嵌型別
template < typename t>
class cmyiterator
;
那麼我們可以通過cmyiterator::value_type獲取迭代器所指向的型別。
接下來我們要實現乙個演算法fun,其返回值型別為引數所指向的型別。
template typename cmyiterator::value_type fun(cmyiteratori)
這裡我們內嵌value_type這個型別的意義在於:我們希望fun這個函式能夠適應所有型別的迭代器。
比如,fun函式我們可以這樣寫:
template typename iter::value_type fun(iter i)
這樣的話,所有定義了value_type內嵌型別的迭代器都可作為fun()的引數。
目前,似乎我們的需求滿足了,並沒有什麼bug,與traits技術好像也沒什麼關係。
但是當我們考慮將原生指標作為引數時,就會出現問題。原生指標內沒有value_type內嵌型別。
ok,traits技術派上用場了。
我們使用單獨的乙個類獲取value_type資訊:
template class traits
;template typename traits::value_type fun(iter i)
不過好像並沒有解決原生指標的問題。
ok,這時我們要採用partial specialization(偏特化)。
template class traits;
template typename traits::value_type fun(iter i)
STL學習筆記 迭代器以及Traits技術
迭代器模式 提供一種方法,使之能夠依序訪問某個容器中的各個元素,而又無需暴露該容器的內部表述方式。迭代器是容器和演算法之間的膠合劑。1.如何判斷迭代器的型別 1 通過編譯器對函式模版的實參推倒可以解決引數類別的判定,如下 templatevoid func imp1 i iter,t t templ...
STL之迭代器與traits程式設計技法
iterator模式定義如下 提供一種方法,使之能夠依序巡防某個聚合物所含的各個元素,而又不暴露該聚合物的內部表示式。迭代器是一種smart pointer 舉例auto ptr template class auto ptr auto ptr template auto ptr auto ptr ...
C 模板程式設計中的Traits技術
由於c 不支援type of,所以traits技術,實際上就是通過通過模板中的型別推導機制,獲取到變數的型別,以其在編譯器確定函式的呼叫。stl中的迭代器就廣泛的運用到該技術。下面是乙個簡單的例子 凡是乙個迭代器,我們總是希望能夠知道它所指的資料的資料型別,我們可以這樣做 template clas...