首頁 >後端開發 >C++ >我們如何簡潔地迭代打包的可變參數模板參數列表?

我們如何簡潔地迭代打包的可變參數模板參數列表?

Linda Hamilton
Linda Hamilton原創
2024-10-24 03:28:301001瀏覽

How Can We Iterate Over a Packed Variadic Template Argument List Concisely?

如何迭代打包可變參數模板參數列表

在C 中,迭代打包可變參數模板參數列表會帶來挑戰,因為無法知道參數的數量並從中單獨檢索資料。在建構函數時使用巨集進一步加劇了這個問題,這阻止了遞歸呼叫。

為了解決這個問題,提供的解決方案採用了自訂類型any,它可以保存不同類型的資料。透過將此類型傳遞給可變參數模板,參數將擴展為任何物件的向量。隨後,可以使用專門的 getter 函數 (get()) 檢索該向量的各個元素,從而允許對不同類型的資料進行迭代。

雖然此方法可以完成任務,但它確實需要詳細函數調用,例如 foo(arg(1000))。為了簡化這一點,我們尋求一種更簡潔的迭代方法或等效於 std::get() 的打包可變參數模板參數清單。

使用 STL 折疊表達式和 Lambda 的解決方案

對於 C 17 及更高版本,折疊表達式可以與 lambda 函數一起使用來實現迭代。 lambda 可以在循環內執行任意操作,包括遞增計數器和列印目前參數:

<code class="cpp">template <class ... Ts>
void Foo (Ts &amp;&amp; ... inputs)
{
    int i = 0;

    ([&amp;]
    {
        // Do things in your &quot;loop&quot; lambda

        ++i;
        std::cout << &quot;input &quot; << i << &quot; = &quot; << inputs << std::endl;

    } (), ...);
}</code>

此方法提供了更簡潔易讀的迭代機制。

替代方案處理循環中斷

雖然上述解決方案完成了任務,但它缺乏在循環內實現中斷或返回的能力。為了解決這個問題,我們可以利用以下的解決方法:

  • 使用try/throw: 在這種方法中,我們可以在lambda 中拋出異常來跳出循環。然而,由於異常的開銷,此方法會顯著影響效能。
  • 變數/if 開關: 這種方法涉及建立一個變數來控制迴圈並使用 if 語句來中斷迴圈。雖然有效,但它可能會導致程式碼不太美觀。

以上是我們如何簡潔地迭代打包的可變參數模板參數列表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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