如何使用 Pack 擴充循環參數套件
使用可變參數範本和函數時,了解 pack 的使用至關重要擴充。考慮以下程式碼:
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); }
編譯後,此程式碼失敗並出現錯誤:
Error C3520: 'args': parameter pack must be expanded in this context
解決方案:在 Braced-Init-List 中擴充包裝
要解決此問題,您可以在braced-init-list:template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
理解Braced-Init-List
數組定義中的初始化器列表將包擴展擴展為逗號分隔的列表。強制轉換為 void 可確保使用的逗號運算符是內建運算符,而不是任何重載版本。這保證了包擴展的從左到右評估。C 17 的其他選項
在C 17 中,您可以使用折疊來簡化程式碼表達式:((void) bar(std::forward<Args>(args)), ...);
結論
透過在C 17中的花括號初始化列表或折疊表達式中使用包擴展,您可以有效地循環參數包並避免編譯錯誤。理解這項技術對於在 C 中使用可變參數模板和函數至關重要。
以上是如何正確循環可變參數模板中的參數包?的詳細內容。更多資訊請關注PHP中文網其他相關文章!