首頁 >後端開發 >C++ >如何使用套件擴展在 C 中迭代參數包?

如何使用套件擴展在 C 中迭代參數包?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-24 10:59:13463瀏覽

How Can I Iterate Over a Parameter Pack in C   Using Pack Expansion?

可變參數模板:解開迭代的包擴展

可變參數模板在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 &amp;&amp;... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}

此修訂後的程式碼採用細緻的方法來確保正確的評估:

  • 防止空擴展: 空Args 將導致長度為0 的數組,這在C 中是非法的。為了防止這種情況,我們確保陣列至少包含一個元素。
  • 完美轉送:我們使用完美轉送(std::forward)來避免潛在的副本並保留潛在的 const 限定符。
  • 中和回傳類型:我們將 bar() 的回傳值轉換為 void 以利用內建逗號運算符,確保從左到右求值。

在 C 17 中,折疊表達式提供了更緊湊的解決方案:

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

This approach guarantees the desired left-to-right expansion unequivocally.

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

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