迭代打包的可變參數模板參數列表
在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語句,可以實作解決方法:
自訂巨集方法:
另一種方法涉及建立一個自訂巨集來建構一個型別保存所有參數,然後將其展開到向量內。雖然這是一個非標準方法,但它可以實現所需的功能。
<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中文網其他相關文章!