traits技術是stl中比較常見的一種c++語言技巧表達方式之一,通過c++模板的能力,將物件型別萃取出來,讓同乙個介面實現對應的功能。特別是在演算法和容器中,可以解耦出具體的物件型別,使得兩者通過迭代器實現鏈結。
c++中通過使用迭代器,將stl中的容器和演算法相解耦,在c++中編譯器編譯器需要考慮相應的型別判斷。
首先我們通過模板獲取形參的資料型別
// 通過class 自動推導iter型別和*iter型別
template
<
class
t>
void
func
(i iter)
template
<
classi,
class
t>
void
func_tmpl
(i iter, t t)
intmain()
對於形參型別的型別推導,這是最簡單的方式
但是模板引數不能簡單地通過型別返回
template
<
class
t>
(*t)
func
(t t)
這樣會編譯失敗,對於返回值的型別推導,stl的做法是在內部宣告的迭代器中,構造乙個型別,通過模板推導出返回型別
template
<
class
t>
struct iter_traits
; t&
operator*(
)const};
template
<
class
t>
typename t::value_type
func
(t iter)
同樣是通過了模板型別構建乙個類來推導形參的型別;
當然,c++11同樣也支援了尾行的型別推導
template
<
typename it>
auto
func
(it begin, it end)
->
decltype
(*beg)
以上常見的返回值型別是物件型別,但對於c++原生的指標型別而言,上述的**會編譯失敗。這樣我們需要考慮對於原生指標型別進行特化。
模板在編譯時支援特化,特化有全特化和偏特化
template
<
classt,
class
i>
void
fun(t t, i i)
//全特化
template
<
>
void fun<
int,
char
>
(int a,
char b)
//偏特化
// template
// void func(t t, int i)
並不存在偏特化的寫法,偏特化可以通過函式過載實現。
而這裡的偏特化是為了引入traits寫法
// 類返回值型別推導
template
<
class
t>
struct iter_traits
; t&
operator*(
)const};
template
<
class
t>
typename t::value_type
func
(t iter)
// 原生指標型別
template
<
class
t>
tfunc
(t* iter)
// 原生指標const型別
template
<
class
t>
t func
(const t* iter)
上述**任然存在問題,那就是針對每個func模板,都需要一次實現3個模板型別。stl的做法是通過構建了乙個traits類,自動推導返回型別
template
<
class
t>
struct iterator_traits
;template
<
class
t>
struct iterator_traits>
;template
<
class
t>
struct iterator_traits<
const t*
>
;
這樣就構建了返回值型別,那麼拓展到容器中,**就可以這樣寫了
template
<
class
t>
struct iter_impl
; t&
operator*(
)const};
template
<
class
i>
typename iterator_traits
::value_type
get(i ite)
intmain()
通過定義內嵌型別,我們獲得了知曉iterator所指元素型別的方法,通過traits技法,將函式模板對於原生指標和自定義iterator的定義實現了統一。 C語言筆記之技巧
1.要從邏輯上刪除一段c 更好的辦法時使用 if指令。if 0 statements endif 使用 雖好,但是當某段 之中如果原來就有注釋存在,這種方法就不能奏效。2.在c語言中,陣列引數是以引用的形式進行傳遞的,也就是傳址呼叫,而標量和常量是按值傳遞的。在函式中對標量引數的任何修改都會在函式返...
STL中的Traits程式設計技巧
stl原始碼剖析 一書中提到traits程式設計技法,它的作用是獲取型別 associated type 的特性。這樣講比較抽象,到底什麼是相應型別,或者到底什麼時候需要用到traits程式設計技法呢?先來看乙個例子。假設有這麼乙個函式,接受乙個iterator,返回這個iterator所指代的型別...
STL之traits程式設計技法
traits程式設計技法利用了 內嵌型別 的程式設計技巧與編譯器的template引數推導功能。下面主要看看利用traits程式設計技法實現的迭代器萃取機制。5種迭代器型別定義 struct input iterator tag struct output iterator tag struct f...