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
中,然後就會定義乙個list
的c
變數,這樣看起來是可以的,因此我們使用list
容器的時候就是list《乙個型別》
,但是這裡為什麼就不行呢?是因為list
容器實質上是有第二引數的,雖然第二引數有預設的引數,正如我們平常使用的那樣,只需要指定乙個引數,但是在這裡無法通過編譯,因此,我們使用如下解決辦法:
template
using lst = std::list
std::allocator>;
xcls mylst2;
// 編譯時需要加上std=c++11
使用c++11
的using
關鍵字的新功能,來定義乙個型別的別名,而且使用在模板的情況下,因此我們編譯時要指定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物...