使用包擴展循環參數包
在可變參數模板中,參數包允許將靈活數量的參數傳遞給函數。嘗試迭代參數包時,如果參數包未正確展開,則可能會出現編譯器錯誤。
考慮以下程式碼:
template<typename... Args> static void foo2(Args... args) { (bar(args)...); // Error: parameter pack must be expanded }
此程式碼無法編譯並出現錯誤「錯誤C3520:'args':必須在此上下文中擴展參數包。」出現此錯誤的原因是參數包args 需要先擴展,然後才能在bar 函數呼叫中使用。
實作此擴充的一種方法是利用 braced-init-list (用大括號括起來的初始化清單)。透過將擴充放置在虛擬數組的初始值設定項清單中,編譯器可以執行必要的擴充。
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
初始值設定項清單允許擴展整個包,並且強制轉換為 void 確保逗號無論 bar 的返回類型是否有任何重載運算符,都會使用運算符。
C 17 中引入的另一種方法是使用fold表達式:
((void) bar(std::forward<Args>(args)), ...);
此程式碼提供了一種簡潔有效的方法來循環參數包。
以上是如何正確迭代 C 參數包以避免編譯器錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!