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

Susan Sarandon
リリース: 2024-11-11 03:51:02
オリジナル
250 人が閲覧しました

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

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

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

C 17 Fold Expression

(f(args), ...);
ログイン後にコピー

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

((void)f(args), ...);
ログイン後にコピー
C 17 より前の解決策

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

{ print(Args)... }
ログイン後にコピー
print() は 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)... }
ログイン後にコピー
不必要なメモリ割り当てが心配な場合は、次のように定義できます。リストの初期化をサポートしますが、データは保存しないカスタム型:

以上がC ですべての可変個引数テンプレート引数に対して関数を呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート