首頁 >後端開發 >C++ >如何使用套件擴展正確循環 C 參數包?

如何使用套件擴展正確循環 C 參數包?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-04 05:41:39183瀏覽

How Can I Correctly Loop Through a C   Parameter Pack Using Pack Expansion?

使用套件擴充循環參數套件

在提供的程式碼片段中,您打算使用以下方法循環遍歷可變長度包包參數擴展語法。但是,程式碼無法編譯,並出現錯誤「參數包必須在此上下文中擴展。」

要解決此問題,您需要將包擴展放置在允許的上下文中。一個合適的位置是在花括號初始化列表中。考慮以下修改後的程式碼:

template<typename... Args>
static void foo2(Args &&... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}

其工作原理如下:

  • 虛擬陣列的初始值設定項目清單內的程式碼包含在 {} 中。
  • 套件擴充語法在初始化清單中使用。具體來說, ( (void) bar(std::forward(args)), 0) 會針對包中的每個參數展開。
  • 逗號運算子用於分隔每個表達式,確保bar() 函數會為每個參數呼叫。
  • bar(std::forward(args)) 周圍的括號用來強制轉換結果作廢。這可以確保使用內建的逗號運算符,而不是重載的運算符。
  • 建立的虛擬陣列至少包含一個元素,以避免在參數包為空時建立非法的 0 長度陣列。

透過此修改,程式碼將成功編譯並循環參數套件。

C 17 Fold表達式

在C 17 中,您可以使用折疊表達式來簡化程式碼:

((void) bar(std::forward<Args>(args)), ...);

此表達式來簡化程式碼:

此表達式來簡化程式碼展開套件並套用指定的操作(在本例中,呼叫bar( )) 從左到右。

以上是如何使用套件擴展正確循環 C 參數包?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn