可變參數模板:解開迭代的包擴展
可變參數模板在C 中賦予了卓越的表現力,但冒險進入它們的領域可能會揭示不可預見的複雜性。當嘗試使用包擴展迭代參數包時,就會出現這樣的挑戰。考慮以下程式碼:
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); } int main() { foo2(1, 2, 3, "3"); return 0; }
編譯時,此程式碼遇到錯誤:「'args':參數包必須在此上下文中擴展。」此問題源自於無法在函數呼叫中直接擴充參數包。
解決方案在於在花括號初始化列表中利用包擴展,這是一個明確允許此類擴展的上下文。透過將擴充放置在虛擬數組的初始值設定項清單中,我們可以強制執行所需的行為:
template<typename... Args> static void foo2(Args &&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
此修訂後的程式碼採用細緻的方法來確保正確的評估:
在 C 17 中,折疊表達式提供了更緊湊的解決方案:
((void) bar(std::forward<Args>(args)), ...); ``` This approach guarantees the desired left-to-right expansion unequivocally.
以上是如何使用套件擴展在 C 中迭代參數包?的詳細內容。更多資訊請關注PHP中文網其他相關文章!