在可變參數模板參數上呼叫函數
目標是實現一個print() 函數,它接受可變數量的參數並執行每個參數上的任意函數。這是理想的遞歸實現的緊湊替代方案,每個參數類型都有單獨的專門化。
C 17 解
在C 17 中,這可以使用摺疊式:
(f(args), ...);
此表達式擴充args 中的參數並對每個參數呼叫f()。如果f() 傳回帶有重載逗號運算子的對象,請使用:
((void)f(args), ...);
Pre-C 17 解
對於C 17 之前的C版本,一種常見的方法是使用列表初始值設定項來擴展參數:
{ 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)... }
但是,為了防止重載逗號運算子的潛在問題,可以如下更新巨集:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
Pre -C 17 解決方案可能還需要額外的考慮,以避免不必要的記憶體分配。
以上是如何在 C 中呼叫可變參數模板參數上的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!