玩轉c 模板模板引數

2021-09-20 03:44:40 字數 2904 閱讀 8949

#include

#include

#include

#include

using

namespace std;

#if 1

// case1:不使用模版模版引數,明確指定容器的型別,比如stl庫的stack實現,見下:

template

<

typename t,

typename cont = std::deque>

class

stack1};

intmain

(int argc,

char

const

*ar**)

#elif 0

// case2:使用alias template的語法(c++11)傳參

// 推導過程:其實e只是佔位符號,會替換alias template(即using語法)中宣告的原型。此處可以省略e,使用前面已出現的t。(具體參見case3)

template

<

typename t,

template

<

typename e>

class

cont

= std::deque>

class

stack2};

template

<

class

e>

using vec = vector>

;int

main

(int argc,

char

const

*ar**)

#elif 0

// case3:省略e,使用之前出現過的t去做推導

template

<

typename t,

template

<

typename

>

class

cont

= std::deque>

class

stack3};

template

<

class

e>

using vec = vector

>

;int

main

(int argc,

char

const

*ar**)

#elif 0

// case4

// 同理,可以不寫using語法,直接在模板類中寫全,此方法適用於c++98(但是需要注意兩個》在一起的時候需要加空格,不然報錯)

template

<

typename t,

template

<

typename e,

typename alloc = allocator

>

class

cont

>

class

stack4};

intmain

(int argc,

char

const

*ar**)

#elif 0

// case5:省略佔位符e,使用之前出現過的t

// 也可以省略乙個佔位符號e,注意:如果有預設=出現的地方不能省略型別別名,比如「typename alloc = allocator」中的t

// 要省略t就得替換為前置出現的別名(因為省略型別之後變為了模板類),

// 比如「typename alloc = allocator」變為「templateclass alloc = alloctor」,詳見case6

template

<

typename t,

template

<

typename

,typename alloc = allocator>

class

cont

>

class

stack5};

intmain

(int argc,

char

const

*ar**)

#elif 0

// case6:同理,可以省略m,使用之前的t,如case7

// case6\case7 可以通過編譯,但無測試用例,太複雜。

template

<

typename t,

template

<

typename

,template

<

typename m>

class

alloc

= allocator>

class

cont

>

class

stack6};

intmain

(int argc,

char

const

*ar**)

#elif 0

// case7:同理,可以省略m,使用之前的t,如case7

// template

<

typename t,

template

<

typename

,template

<

typename

>

class

alloc

= allocator>

class

cont

>

class

stack7};

intmain

(int argc,

char

const

*ar**)

#endif

C 模板模板引數

c 模板的使用一共有以下幾種情況。而本篇介紹模板模板引數。模板引數就是模板的引數,我們一般指定為t型別,實際上可以使用任何的名字,例如指定乙個foo的模板引數 temlate foo calc const foo a,const foo b 而模板模板引數則是模板的引數又是乙個模板,例如 templ...

C 模板模板引數

模板引數就是模板的引數,我們一般指定為t型別,實際上可以使用任何的名字,例如指定乙個foo的模板引數 temlate foo calc const foo a,const foo b 而模板模板引數則是模板的引數又是乙個模板,例如 templatetypename container class x...

C 基礎 模板引數與模板繼承

函式引數可以設定乙個預設值,我們現在可以對類模板的型別引數設定乙個預設型別。指定泛型stack的預設型別引數為 int template typename t int class stack 當我們這樣定義乙個物件時 stack stack 使用預設的方式,或者說隱式的方式,例項化了乙個stack物...