《STL原始碼剖析》traits技法分析

2022-07-29 12:30:11 字數 1283 閱讀 8525

在完成乙個迭代器的時候,我們可能會暴露太多的細節在外面,為了將這些細節給隱藏,我們需要封裝,這也是為什麼每一種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容器的具...