在可變參數模板參數上呼叫函數
在C 中,人們可能希望設計一個可以在任意數量的參數上無縫運行的函數各種類型的參數。雖然遞歸模板專門化允許此類功能,但它會產生大量冗餘程式碼。為了解決這個問題,我們尋求更有效的方法。
C 17 折疊表達式解決方案
在C 17 中,折疊表達式提供了一個簡單的解決方案:
(f(args), ...);
此表達式有助於在args 變數包中的每個參數上順序呼叫f。但是,如果f 傳回帶有重載逗號運算子的對象,則應使用以下語法:
((void)f(args), ...);
C 17 之前的解決方案
C 17之前,一種典型的方法涉及使用具有故意非void傳回類型的列表初始值設定項目:
{ print(Args)... }
但是,這需要將表達式包裝在未使用的變數中,以防止由於 print 的 void傳回型別而導致編譯錯誤:
using expand_type = int[]; expand_type{ (print(Args), 0)... };
為了增強此模式的可重用性,可以定義一個巨集:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... } SO_EXPAND_SIDE_EFFECTS(print(Args));
為了減輕大數組的潛在分配,可以使用自定義結構:
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
以上是如何在 C 中呼叫可變模板參數上的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!