首頁 > 後端開發 > C++ > 如何在 C 中迭代打包的可變參數模板參數列表?

如何在 C 中迭代打包的可變參數模板參數列表?

Susan Sarandon
發布: 2024-10-23 18:09:02
原創
552 人瀏覽過

How to Iterate Over Packed Variadic Template Argument Lists in C  ?

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

在C 中,迭代打包的可變參數模板參數列表會帶來特定的挑戰,因為缺乏編譯時反射能力。然而,有一些技術可以讓我們解決這個任務。

理解問題

目標是迭代一組模板參數,提取特定的資料類型(例如int、char*、float)並將其儲存在單獨的向量中。此外,還需要一個向量來追蹤參數出現的順序。

接近解決方案

在Lambda 中使用折疊表達式:

對於混合類型輸入,C 17 折疊表達式可以與lambda 表達式一起使用。 lambda 封裝了循環行為,遞增計數器並列印每個輸入的值及其位置。

<code class="cpp">template<class ... Ts>
void Foo(Ts && ... inputs) {
    int i = 0;
    ([&]() {
         ++i;
         std::cout << "input " << i << " = " << inputs << std::endl;
    }(), ...);
}
登入後複製

處理Return/Break 語句:

如果return 或迴圈內需要使用break語句,可以實作解決方法:

  • 使用Try/Throw:拋出例外來退出循環。 注意: 這種方法會顯著降低函數速度。
  • 變數/If 開關: 使用代表每種類型的變數控制的 switch 語句。這並不理想,但可以處理 return/break 語句。

自訂巨集方法:

另一種方法涉及建立一個自訂巨集來建構一個型別保存所有參數,然後將其展開到向量內。雖然這是一個非標準方法,但它可以實現所需的功能。

<code class="cpp">struct any {
  void do_i(int e) { INT = e; }
  void do_f(float e) { FLOAT = e; }
  void do_s(char* e) { STRING = e; }

  int INT;
  float FLOAT;
  char* STRING;
};

#define def(name) \
  template<typename... T> \
  auto name(T... argv) -> any { \
   std::initializer_list<any> argin = { argv... }; \
    std::vector<any> args = argin;
#define get(name, T) get<T>()(args[name])
#define end }</code>
登入後複製

此方法需要手動呼叫 arg() 函數為每個參數建立一個 any 實例。

結論

迭代 C 中的打包可變參數模板參數清單需要創新的解決方案。這裡討論的方法解決了這個挑戰,允許有效處理混合類型參數,同時保持可移植性和跨平台相容性。

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

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