c 11變長引數函式模板

2022-08-30 12:54:09 字數 1706 閱讀 4149

by francis_hao    mar 25,2018

乙個最簡單的例項大概是這個樣子:

#include

usingnamespacestd;

/*變長引數函式模板宣告

*/template<typename...t>

voidprint(t...val);

/*邊界條件

*/voidprint(void)

/*遞迴的特例化定義

*/template<typenamet1,typename...t2>

voidprint(t1 start,t2...var)

intmain(void)

其中的宣告其實是沒什麼用的,只是告訴使用者可以按照這樣的格式使用,如果不做這個宣告,只保留"邊界條件"和"遞迴的特例化定義",這樣雖然可行,但是未免會造成困惑。

執行結果如下:

實際上,這個"變長"付出的代價還是很大的,要遞迴的例項出n個函式,最終再呼叫邊界條件的函式。過程如下

以上可見,這個變長引數函式模板實現的一點也不"優雅",有點強行打補丁的感覺。看看"別人家的孩子"在這個問題上是怎麼做的呢?以python為例,沒有對比就沒有傷害~

defprintf(*arg):

forvalinarg:

print(val)

if"__main__"==__name__:

printf(1,2,3,4)

michael wong,ibm xl編譯器中國開發團隊 著 深入理解c++11:c++11新特性解析與應用 機械工業出版社:北京,2013.6

走進C 11(十四)變長引數模板

解釋 c 03只有固定模板引數。c 11 加入新的表示法,允許任意個數 任意類別的模板引數,不必在定義時將引數的個數固定。變長模板 變長引數是依靠c 11新引入的引數包的機制實現的。templatestruct tuple tuple t0 types不含任何實參tuplet1 types含有乙個實...

C 11可變引數函式模板

在log時引數是型別和個數是不固定的,所以在做log函式時,很多煩惱,不過c 11給我們帶來的希望 include include using namespace std class logger static void makeloggeroff static bool loggerstate t...

C 11可變引數函式模板

2013 04 27 13 34 4162人閱讀收藏 舉報 c 模板 25 c c 84 在log時引數是型別和個數是不固定的,所以在做log函式時,很多煩惱,不過c 11給我們帶來的希望 這個是今天剛讀到的,加上自己的理解為位元組寫了乙個logger類,也給大家瞧瞧啊,歡迎大蝦拍板轉 cpp vi...