「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ ですべての可変個引数テンプレート引数に対して関数を呼び出す方法

C++ ですべての可変個引数テンプレート引数に対して関数を呼び出す方法

2024 年 11 月 19 日に公開
ブラウズ:580

How to Invoke a Function on All Variadic Template Arguments in C  ?

C 可変個引数テンプレート: すべてのテンプレート引数で関数を呼び出す

C では、多くの場合、可変個引数テンプレート引数を反復処理して、呼び出しなどの特定の操作を実行することが望ましいです。関数。これは、

C 17 Fold Expression

(f(args), ...);

のいずれかを使用して実現できます。ただし、呼び出された関数がオブジェクトを返す可能性がある場合は、オーバーロードされたカンマ演算子を使用する場合は、次を使用する必要があります:

((void)f(args), ...);

Pre-C 17 解決策

一般的なアプローチは、リストの初期化を利用し、その中で展開を実行することです:

{ print(Args)... }

Because print() returns void の場合は、 int:

{ (print(Args), 0)... }

を返すことで問題を回避できます。任意の数の引数で動作します。パックに常に少なくとも 1 つの要素を含めることができます:

{ 0, (print(Args), 0)... }

これをカプセル化できますパターンを再利用可能なマクロに変換します:

namespace so {
    using expand_type = int[];
}

#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)... }

不必要なメモリ割り当てが心配な場合は、リストをサポートするカスタム型を定義できます。初期化しますが、データは保存しません:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&&...) {}
    };
}
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3