C 11 14之可變參類模板與模板模板引數

2021-10-05 02:38:20 字數 2360 閱讀 7205

通過tuple和遞迴呼叫展開引數包

總結模板 模板引數

組合關係(復合關係):

class

bclass

a

組合關係展開引數包案例
template

<

typename first,

typename..

. others>

class

myclass

>

myclass

(first parf, others.

.. paro)

:m_i

(parf)

,m_obj

(paro ...

) first m_i;

myclass m_obj

;//組合關係,引數多的類包含引數少的類

注意每乙個物件位址都不相同

實現思路:計數器從0開始,每處理乙個引數,計數器+1;

一直到把所有引數處理完, 最後乙個模板偏特化,作為處理結束。

元組介紹:

tuple<

float

,int

,int

>

mytuple

(13.4f,52

,10);

//乙個元組,一堆東西的組合

cout << get<

0>

(mytuple)

<< endl;

cout << get<

1>

(mytuple)

<< endl;

cout << get<

2>

(mytuple)

<< endl;

通過tuple和遞迴呼叫展開引數包案例
//mycount 用於統計,從0開始,mymaxcount表示引數數量

template

<

int mycount ,

int mymaxcount,

typename..

.t>

class

myclass

}//需要乙個特殊版本結束遞迴呼叫

template

<

int mymaxcount,

typename..

.t>

class

myclass

>

}template

<

typename..

.t>

void

testfunc

(const tuple

>

&t)//可變引數模板

void

func()

獲取引數包的方法有很多種,一般都離不開遞迴

表示這是個 模板引數,這個模板引數本身,又是 乙個模板

template

<

typename t;

//型別 模板引數

typelate<

class

>

class

container

;//模板 模板引數

//或者寫成typelatetypename container w只是佔位,沒有用途,可以省略

>

/* typelateclass container

*/class

myclass}};

template

<

typename t>

using myvec = vector>

;//這種套路或者寫法很固定

template

<

typename t>

using mylist = list>

;//這種套路或者寫法很固定

myclass<

int, myvec> myvec_obj;

//往容器中塞元素,元素為int

C 11 14之可變參模板

可變參類模板 variadic template 允許模板中有0到任意個模板引數 t emplate typename.t void myfunc t.ar s myfunc 0 0 myfunc 11 23 2 2 myfunc 14 12.4 nj 3 4 4 ar s 稱為一包或者一堆引數,這...

C 可變參模板

可變引數模板是乙個接受可變數目引數的模板函式或模板類,在模板引數列表中,typename 指出接下來的引數表示0個或多個型別的列表,乙個型別名後面跟省略號表示0個或多個給定型別的非型別引數的列表。在函式引數列表中,如果乙個引數的型別是乙個模板引數包,則此引數也是乙個函式引數包。可變引數模板通常是遞迴...

C 類模板與模板類

6.3 類模板和模板類 所謂類模板,實際上是建立乙個通用類,其資料成員 成員函式的返回值型別和形參型別不具體指定,用乙個虛擬的型別來代表。使用類模板定義物件時,系統會實參的型別來取代類模板中虛擬型別從而實現了不同類的功能。定義乙個類模板與定義函式模板的格式類似,必須以關鍵字template開始,後面...