C++11變長參數模板

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

  

CUBEMX不定長_CUBEMX不定長

實參的個數也可以是 0,所以 tuple<> someInstanceName 這樣的定義也是可以的。

若不希望產生實參個數為 0 的變長參數模板,則可以採用以下的定義:

  

CUBEMX不定長_變長參數_02

變長函數參數包

除了在模板參數中能使用...表示不定長模板參數外,函數參數也使用同樣的表示法代表不定長參數。

  

CUBEMX不定長_函數參數_03

其中,Params 與 parameters 分別代表模板與函數的變長參數集合, 稱之為參數包 (parameter pack)。參數包必須要和運算符"..."搭配使用。

變長參數的使用

長參數模板中,變長參數包無法如同一般參數在類或函數中使用; 因此典型的手法是以遞歸的方法取出可用參數:

  

CUBEMX不定長_函數參數_04

printf 會不斷地遞歸調用自身:函數參數包 args... 在調用時, 會被模板類別匹配分離為 T value和 Args... args。 直到 args... 變為空參數,則會與簡單的 printf(const char *s) 形成匹配,退出遞歸。

另一個例子為計算模板參數的個數,這裏使用相似的技巧展開模板參數包 Args...:

  

CUBEMX不定長_運算符_05

其它變長參數的展開形式

使用運算符"..."還能在代碼各處對參數包施以更復雜的展開操作。舉例來説,一個模板類的定義:

  

CUBEMX不定長_運算符_06

變長模板參數個數

變長參數的數量可以藉以下的語法得知:

  

CUBEMX不定長_函數參數_07

SomeStruct<Type1, Type2>::size 是 2,而 SomeStruct<>::size 會是 0。 (sizeof...(Args) 的結果是編譯期常數。)