SHAMELESS COPY [approved by its source]
參數組可以只能在嚴格定義的上下文列表中擴展,並且運算符,
不是其中之一。換句話說,不可能使用包擴展來生成由運算符,
分隔的一系列子表達式組成的表達式。
經驗法則是「擴展可以生成,
-分離的模式列表,其中,
是列表分隔符。」運算符,
不構造語法意義上的列表。
要呼籲每一個參數的函數,你可以使用遞歸(這是在可變參數模板編程的盒子的主要工具):
#include <utility>
template<typename T>
void foo(T &&t){}
template<typename Arg0, typename Arg1, typename ... Args>
void foo(Arg0 &&arg0, Arg1 &&arg1, Args &&... args){
foo(std::forward<Arg0>(arg0));
foo(std::forward<Arg1>(arg1), std::forward<Args>(args)...);
}
auto main() -> int{
foo(1, 2, 3, "3");
}
有用的非複製的信息
你可能還沒有在這個答案中看到的另一件事是使用&&
說明符和std::forward
。在C++中,&&
說明符可以表示以下兩種情況之一:右值引用或通用引用。
我不會進入右值引用,但有人使用可變參數模板;普遍的參考文獻是上帝派來的。
完美轉發
一個std::forward
和普遍引用的用途是類型的其他功能完美轉發。
在您的例子,如果我們通過一個int&
到foo2
它會自動降級爲int
,因爲模板扣除後所產生的foo2
功能的簽名,如果你想要再往前這個arg
到將修改它的另一個功能ny引用,你會得到不想要的結果(該變量不會被改變),因爲foo2
將通過傳遞一個int
給它傳遞一個臨時引用。爲了解決這個問題,我們指定一個轉發功能,將任意類型的參考轉換爲變量(右值爲或左值)。然後,爲了確保我們傳遞的轉發函數中傳遞的確切類型,我們使用std::forward
,然後只有那麼我們是否允許降級類型;因爲我們現在處於最重要的地步。
如果需要,請閱讀universal references和perfect forwarding;斯科特邁爾斯作爲一種資源相當出色。
如果'Args'爲空? – CoffeeandCode 2014-09-05 07:28:15