1. 程式人生 > >C++模板之可變模板參數

C++模板之可變模板參數

函數 pen tar 展開 iad 單個 pla 要求 變量

可變模板參數---- C++11新特性

  • 可變模板參數(variadic templates)是C++11新增的最強大的特性之一,它對參數進行了高度泛化,它能表示0到任意個數、任意類型的參數
  • 由於可變模版參數比較抽象,使用起來需要一定的技巧,所以它也是C++11中最難理解和掌握的特性之一

參數包(parameter pack)

模板參數包,如:

  template<typename… Args>class tuple;

  • Args標識符的左側使用了省略號,在C++11中Args被稱為“模板參數包”,表示可以接受任意多個參數作為模板參數,編譯器將多個模板參數打包成“單個”的模板參數包.

函數參數包,如

  template<typename…T> void f(T…args);

  • args被稱為函數參數包,表示函數可以接受多個任意類型的參數.

在C++11標準中,要求函數參數包必須唯一,且是函數的最後一個參數; 模板參數包則沒有

聲明一個變量(或標識符)為可變參數時,省略號位於該變量的左側

使用參數包時,省略號位於參數名稱的右側,表示立即展開該參數,這個過程也被稱為解包

包擴展表達式

設args被聲明為一個函數參數包,其擴展方式有

printArgs(args…)

  • 相當於printArgs(args1,args2,…,argsN)

printArgs(args)…

  • 相當於printArgs(args1),…, printArgs(argsN)

(printArgs(args),0)… 逗號表達式

  • 這是一個逗號表達式。相當於(printArgs(args1),0),…(printArgs(argsN),0)

包擴展表達式“exp…”相當於將省略號左側的參數包exp視為一個整體來進行擴展

C++模板之可變模板參數