」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 我們如何簡潔地迭代打包的可變參數模板參數列表?

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

發佈於2024-11-04
瀏覽:268

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 可以在循環內執行任意操作,包括遞增計數器並列印目前參數:

template 
void Foo (Ts && ... inputs)
{
    int i = 0;

    ([&]
    {
        // Do things in your "loop" lambda

          i;
        std::cout << "input " << i << " = " << inputs << std::endl;

    } (), ...);
}

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

處理循環中斷的替代方案

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

  • 使用try/throw: 在這種方法中,我們可以在lambda 中拋出異常來跳出循環。然而,由於異常的開銷,此方法會顯著影響效能。
  • 變數/if 開關: 此方法涉及建立一個變數來控制迴圈並使用 if 語句來中斷迴圈。雖然有效,但它可能會導致程式碼不太美觀。
版本聲明 本文轉載於:1729667291如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-18
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-18
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-18
  • 如何使用純 CSS 建立等高列?
    如何使用純 CSS 建立等高列?
    使用CSS 實現等高列在Web 開發領域,對視覺吸引力佈局的追求往往導致對等高佈局的渴望高度列。使用純 CSS 實現這種效果可能是一個挑戰,促使許多開發人員轉向背景圖片等解決方案。然而,存在著一種更簡單、更有效的方法。 垂直表格方法為了在不借助背景圖像的情況下實現等高列,“垂直表格”方法事實證明它既...
    程式設計 發佈於2024-11-18
  • 何時以及為何應使用「pip install --user...」?
    何時以及為何應使用「pip install --user...」?
    理解「pip install --user...」的目的「pip install --user...」指令在Python套件管理中具有特定用途,使用戶能夠在其本機使用者目錄中安裝套件。這與 pip 的預設行為有很大不同,pip 通常會在系統範圍的目錄中安裝軟體包,而這項任務通常需要 root 權限。...
    程式設計 發佈於2024-11-18
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-18
  • 對於具有三個「unsigned Short」成員的結構,為什麼「sizeof(myStruct)」會傳回 6 個位元組而不是 8 個位元組?
    對於具有三個「unsigned Short」成員的結構,為什麼「sizeof(myStruct)」會傳回 6 個位元組而不是 8 個位元組?
    C 結構中的記憶體對齊:了解大小差異使用C 結構時,記憶體對齊在決定實際大小方面起著至關重要的作用記憶體中結構體的大小。記憶體對齊是指將資料結構放置在可被特定邊界整除的記憶體位址中。這確保了高效的數據存取和效能優化。 考慮一個 32 位元機器,其中記憶體對齊通常設定為 4 位元組。在這種情況下,由多...
    程式設計 發佈於2024-11-18
  • 腳本標籤中的 HTML 註解還有用嗎?
    腳本標籤中的 HTML 註解還有用嗎?
    腳本標籤內的HTML 註解:一種可疑的做法許多開發人員依賴腳本標籤內的HTML 註解來防止過時的瀏覽器渲染JavaScript程式碼。然而,支援 JavaScript 的瀏覽器的激增使得這種做法在很大程度上已經過時。 為什麼消除腳本標籤中的 HTML 註解? 如今,幾乎所有瀏覽器都理解腳本區塊,即使...
    程式設計 發佈於2024-11-18
  • 如何暫時停用MySQL中的外鍵約束?
    如何暫時停用MySQL中的外鍵約束?
    暫時停用MySQL中的外鍵約束在MySQL中,外鍵約束強制引用完整性,確保相關表之間的數據一致性。但是,在某些情況下,需要暫時停用這些約束,例如在模型刪除期間。 考慮以下具有相互外鍵關係的 Django 模型:class Item(models.Model): style = models....
    程式設計 發佈於2024-11-18
  • 如何使用 PDO 從 PHP 中的 MySQL 預存程序檢索輸出變數?
    如何使用 PDO 從 PHP 中的 MySQL 預存程序檢索輸出變數?
    使用PDO 在PHP 中檢索預存程序輸出變數目標: 從MySQL 預存程序中取得LAST_INSERT_ID() 值並將其指派給PHP 變數。 問題語句儘管提供了使用 PDO 綁定的 PHP 程式碼,但它無法從 simpleProcedure 儲存程序捕獲 LAST_INSERT_ID() 輸出變數...
    程式設計 發佈於2024-11-18
  • 內聯成員函數可以在.cpp檔中實現嗎?
    內聯成員函數可以在.cpp檔中實現嗎?
    C 中的內聯成員函數:深入探究內聯成員函數在類別定義中聲明,但在類別主體之外實現。雖然它們通常駐留在頭文件中,但在某些情況下,將實作放在頭文件中是不可行的。 考慮這樣的場景:類別 A 包含類別 B 的實例,而類別 B 宣告內聯成員函數 getA() 傳回 A 的實例。由於迴圈包含,我們被迫將 get...
    程式設計 發佈於2024-11-18
  • 如何透過適應背景亮度來實現最佳的文字外觀?
    如何透過適應背景亮度來實現最佳的文字外觀?
    使文字外觀適應背景亮度以實現可訪問性和美觀性在當今的數位環境中,確保可訪問性和視覺吸引力至關重要。其中一個關鍵因素是文字與其背景之間的對比度,特別是對於弱視使用者而言。為了解決這個問題,設計人員經常採用根據背景亮度調整文字外觀的技術。 一種方法涉及使用動態更改文字顏色或交換預先定義圖像/圖示的插件或...
    程式設計 發佈於2024-11-18
  • 如何計算MySQL中兩個時間戳記之間的時間差(以天為單位)?
    如何計算MySQL中兩個時間戳記之間的時間差(以天為單位)?
    透過MySQL計算時間戳之間的時間差(以天為單位)取得兩個時間戳之間的時間差通常是數據分析和應用邏輯所必需的。在 MySQL 中,一個常見的問題是如何決定兩個時間戳記之間的天數差異。 預設情況下,MySQL 中兩個時間戳記之間的減法會得到一個以秒為單位的值。當您需要天數差異時,這可能沒有用。要匯出以...
    程式設計 發佈於2024-11-18
  • 如何使用 MySQL 查詢從 HTML 中提取純文字?
    如何使用 MySQL 查詢從 HTML 中提取純文字?
    使用MySQL 查詢從HTML 提取純文字要從資料庫記錄中刪除HTML 標籤,您可以利用MySQL XML 函數,而不是使用PHP 腳本。具體方法如下:使用ExtractValue() for MySQL >= 5.5 進行查詢從MySQL 版本5.5 開始,ExtractValue() 函數可讓您...
    程式設計 發佈於2024-11-18
  • 如何在 MySQL 觸發器中更新同一個表?
    如何在 MySQL 觸發器中更新同一個表?
    更新同一個表的MySQL 觸發器解決方法MySQL 本質上限制觸發器更新它們分配到的同一個表中的行,從而防止遞歸呼叫。儘管存在此限制,仍然存在可行的解決方法。 建議的解決方法不要直接更新觸發器中的行,而是利用執行所需邏輯的儲存程序。此方法將行更新任務與觸發器分離,並允許您規避限制。 範例考慮以下場景...
    程式設計 發佈於2024-11-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3