可變模板參數---- 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視為一個整體來進行擴展