解釋
c++03只有固定模板引數。c++11 加入新的表示法,允許任意個數、任意類別的模板引數,不必在定義時將引數的個數固定。
變長模板、變長引數是依靠c++11新引入的引數包的機制實現的。
templatestruct tuple ;
tuple<> t0; // types不含任何實參
tuplet1; // types含有乙個實參:int
tuplet2; // types含有兩個實參:int和float
tuple<0> error; // 錯誤:0不是乙個型別
templatevoid f(types... args);
f(); // ok:args不含有任何實參
f(1); // ok:args含有乙個實參:int
f(2, 1.0); // ok:args含有兩個實參int和double
解包乙個常用的技巧是:利用模板推導機制,每次從引數包裡面取第乙個元素,縮短引數包,直到包為空。template // typename... ts為模板形參包,ts為模式
static void myprint(const char* s, ts... args) // ts... args為函式形參包,args為模式
在c++17標準中,可以使用fold expression,更直接地表達,並且確保正序展開:template
void fun(const t& t)
template
void fun(const t& t, args ... args)
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...