c 語言技巧之traits

2021-10-07 21:11:53 字數 2876 閱讀 5941

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...