首頁 > 後端開發 > C++ > 如何正確迭代 C 參數包以避免編譯器錯誤?

如何正確迭代 C 參數包以避免編譯器錯誤?

Mary-Kate Olsen
發布: 2024-12-17 15:07:09
原創
285 人瀏覽過

How Can I Correctly Iterate Over a C   Parameter Pack to Avoid Compiler Errors?

使用包擴展循環參數包

在可變參數模板中,參數包允許將靈活數量的參數傳遞給函數。嘗試迭代參數包時,如果參數包未正確展開,則可能會出現編譯器錯誤。

考慮以下程式碼:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板