由於c++不支援type_of,所以traits技術,實際上就是通過通過模板中的型別推導機制,獲取到變數的型別,以其在編譯器確定函式的呼叫。stl中的迭代器就廣泛的運用到該技術。下面是乙個簡單的例子:
凡是乙個迭代器,我們總是希望能夠知道它所指的資料的資料型別,我們可以這樣做:
template class iterator ;
當然,這需要我們用到迭代器的類,定義乙個value_type,否則會編譯不過。
然後,無論我們在什麼地方用到迭代器,我們總是可以知道它所指的資料型別:
iterator::value_type value;
但是這樣的寫法有乙個缺陷,就是:指標也是一種迭代器,但是卻不是類,因此我們便無法得知指標指向的是什麼元素。為此引入traits技術,在原來的迭代器類上面再加一層:
template class iterator_traits ;
這樣,我們就可以得知乙個迭代器所指的型別:
iterator_traits::value_type value;
而對於指標,可以使用模板中的偏特化技術:
template class iterator_traits; template class iterator_traits;
因此,模板程式設計中的traits技術,其實就是「萃取」出變數型別。
還可以寫乙個輔助函式:
template iterator_traitsvalue_type(iter iter)
這樣,我們在寫程式的時候,可以把程式寫成兩層:
// 第一層 template void function(iter i) // 第二層: 根據不同的資料型別,做不同的處理 template void _function(iter i, int) template void _function(iter i, char)
STL中,traits程式設計技法 模板
stl中,traits程式設計技法得到了很大的應用,了解這個,才能一窺stl奧妙所在。先將自己所理解的記錄如下 traits技術可以用來獲得乙個 型別 的相關資訊的。首先假如有以下乙個泛型的迭代器類,其中型別引數 t 為迭代器所指向的型別 template class myiterator 當我們使...
C 中Traits技術 2 與迭代器
接著了解c 中的traits技術。traits技術可以獲取乙個型別的相關資訊。比如針對乙個泛型迭代器,型別引數t表示迭代器所指向的型別。template typename t class cmyiterator 我們使用這個迭代器時,如何才能知道這個迭代器所指向元素的型別呢?比如我們可以為這個類加入...
STL中的Traits程式設計技巧
stl原始碼剖析 一書中提到traits程式設計技法,它的作用是獲取型別 associated type 的特性。這樣講比較抽象,到底什麼是相應型別,或者到底什麼時候需要用到traits程式設計技法呢?先來看乙個例子。假設有這麼乙個函式,接受乙個iterator,返回這個iterator所指代的型別...