C 中Traits技術 2 與迭代器

2021-07-11 04:40:01 字數 1202 閱讀 8803

接著了解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...