在完成乙個迭代器的時候,我們可能會暴露太多的細節在外面,為了將這些細節給隱藏,我們需要封裝,這也是為什麼每一種stl容器都提供了一種專屬的迭代器。
為了解決以「迭代器所指物件的型別」為型別
解決辦法是:利用template的引數推導(argument deducation)
template
void func_impl(t iter,t t)
;template
void func(i iter)
這裡編譯器會自動進行template型別推導,於是可以推導出型別t,順利解決問題。
(迭代器相應型別不止是迭代器所指物件的型別一種,最常用的有5種:value_type,difference_type,reference_type,pointer_type,iterator_category)
為了解決以迭代器所指物件型別為返回值的問題
在這裡我們使用宣告內嵌型型別來解決問題:
template
struct myiter
t&operator*()
};template
typename i::type_value
func(i ite)
int main()
但是這種方法有乙個隱藏的缺點:無法為原生指標型別製作迭代器,因為內建型別無法定義內部的value_type,所以我們還需要針對特定情況做特定的處理,這時候我們需要特偏化處理(template partial specialization)
特偏化(template partial specialization)
(1) 類模板的偏特化
例如c++標準庫中的類vector的定義
template
template
struct iterator_traits;
//特化的版本1,為了解決原生指標,比如:int*
template
struct iterator_traits;
//特化版本2,為了解決原生的const指標,比如:const int*
最後的效果就像圖中這樣。
STL原始碼分析 traits
traits 譯作萃取 是c 中一種特殊的程式設計技法,它是模板元程式設計最直接的用例之一。通過traits,可以抽取模板入參型別的各種屬性。接下來我們通過stl中最常見的幾種traits舉例說明。type traits用於判斷型別是否為trival 譯作平凡 如果乙個型別是trivial的,則可以...
STL原始碼 traits的使用
關於iterator traits和type traits的使用,我們什麼時候會使用這兩個類?我們怎麼使用?問題 將 first1,last1 區間內的元素複製一遍。我們需要知道first1迭代器的型別。template iter copy iter first1,iter last1 else n...
STL原始碼剖析
這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...