C++11變長參數模板


C++11變長參數模板

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

  

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

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

  

變長函數參數包

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

   

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

變長參數的使用

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

  

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

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

  

其它變長參數的展開形式

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

  

變長模板參數個數

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

  

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

 參考:http://zh.wikipedia.org/wiki/C++0x#-.7BA.7Czh-hans:.E5.8F.98.E9.95.BF.E5.8F.82.E6.95.B0.E6.A8.A1.E6.9D.BF.3B_zh-hant:.E4.B8.8D.E5.AE.9A.E9.95.B7.E5.8F.83.E6.95.B8.E6.A8.A1.E6.9D.BF.7D-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM