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

2021-10-10 18:01:04 字數 1392 閱讀 9365

解釋

c++03只有固定模板引數。c++11 加入新的表示法,允許任意個數、任意類別的模板引數,不必在定義時將引數的個數固定。

變長模板、變長引數是依靠c++11新引入的引數包的機制實現的。

templatestruct tuple ;tuple<> t0;    // types不含任何實參tuplet1;    // types含有乙個實參:inttuplet2;    // types含有兩個實參:int和floattuple<0> error;    // 錯誤:0不是乙個型別
templatevoid f(types... args);f();    // ok:args不含有任何實參f(1);    // ok:args含有乙個實參:intf(2, 1.0);    // ok:args含有兩個實參int和double
template // typename... ts為模板形參包,ts為模式static void myprint(const char* s, ts... args)  // ts... args為函式形參包,args為模式
解包乙個常用的技巧是:利用模板推導機制,每次從引數包裡面取第乙個元素,縮短引數包,直到包為空。

templatevoid fun(const t& t)templatevoid fun(const t& t, args ... args)
在c++17標準中,可以使用fold expression,更直接地表達,並且確保正序展開:

c 11變長引數函式模板

by francis hao mar 25,2018 乙個最簡單的例項大概是這個樣子 include usingnamespacestd 變長引數函式模板宣告 template typename.t voidprint t.val 邊界條件 voidprint void 遞迴的特例化定義 templ...

C 11新特性之變長引數模板詳解

目錄 在c 11之前,無論是類模板 還是函式模板,都只能按其指定的樣子,接受一組固定數量的模板引數 這已經大大提公升了 的復用!在c 11之後,加入了新的表示方 法,允許任意個數 任意類別的模板引數,同時也不需要在定義時將引數的個數固定。更加像 黑魔法 了。template class magic ...

C 11可變引數函式模板

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