可変引数テンプレート引数での関数の呼び出し
目標は、可変数の引数を受け取り、各引数に対する任意の関数。これは、引数の型ごとに個別の特殊化を行う再帰的実装のコンパクトな代替手段として望まれます。
C 17 ソリューション
C 17 では、これは、フォールド式:
(f(args), ...);
この式は、args 内の引数を展開し、それぞれに対して f() を呼び出します。 f() がオーバーロードされたカンマ演算子を含むオブジェクトを返す場合は、次を使用します。
((void)f(args), ...);
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 中国語 Web サイトの他の関連記事を参照してください。