C 模板模板引數

2021-08-03 06:33:11 字數 1803 閱讀 4713

c++模板的使用一共有以下幾種情況。

而本篇介紹模板模板引數

模板引數就是模板的引數,我們一般指定為t型別,實際上可以使用任何的名字,例如指定乙個foo的模板引數:

temlate

foo calc(const foo& a, const foo& b)

而模板模板引數則是模板的引數又是乙個模板,例如:

template

typename container>

class xcls

;

模板的第乙個引數是t型別,第二個引數是乙個container,他是乙個可以指定乙個u型別的變數。

那麼如何使用他呢?

template

class test

;int main(void)

我們可以定義乙個模板類,然後將其如上方式傳入就可以了。

但是如果傳入乙個容器呢?比如:list

xcls mylst1;
如果編譯就會報錯。我們分析一波:

string 和 list傳入到類xcls中,然後就會定義乙個listc變數,這樣看起來是可以的,因此我們使用list容器的時候就是list《乙個型別》,但是這裡為什麼就不行呢?是因為list容器實質上是有第二引數的,雖然第二引數有預設的引數,正如我們平常使用的那樣,只需要指定乙個引數,但是在這裡無法通過編譯,因此,我們使用如下解決辦法:

template

using lst = std::list

std::allocator>;

xcls mylst2;

// 編譯時需要加上std=c++11

使用c++11using關鍵字的新功能,來定義乙個型別的別名,而且使用在模板的情況下,因此我們編譯時要指定std=c++11

然後我們將list的別名lst傳入進入,就可以編譯通過。

如果是這麼定義的模板引數,還會是模板模板引數嗎?

template

>

class

stack

;

我們定義了乙個stack的模板類,模板引數第乙個是t型別,第二個是乙個sequence型別,有乙個預設的型別是list

使用方法有兩種:

stack

s1;

stack

> s2;

第一種,只指定了第乙個模板引數,使用第二個預設的模板引數。

第二種,指定了兩個模板引數。

但是!這不是模板模板引數。因為,一旦指定了第乙個模板引數,那麼第二個引數的型別就會確定,而真正的模板模板引數,第二個模板引數和第乙個模板引數的型別是沒有關係的,可以指定為第乙個模板引數的型別,也可以指定為其他型別。因此,這不是模板模板引數!!!

以上都是本人自己的理解,如有錯誤,請諒解並懇請您的指正。

C 模板模板引數

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

玩轉c 模板模板引數

include include include include using namespace std if 1 case1 不使用模版模版引數,明確指定容器的型別,比如stl庫的stack實現,見下 template typename t,typename cont std deque class...

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

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