ホームページ >バックエンド開発 >C++ >C 17 の Fold 式はどのようにして可変個引数関数の呼び出しを簡素化できるのでしょうか?

C 17 の Fold 式はどのようにして可変個引数関数の呼び出しを簡素化できるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-19 11:17:02920ブラウズ

How Can C  17 Fold Expressions Simplify Variadic Function Invocation?

C 17 Folds を使用した可変個引数関数呼び出しの簡素化

可変個引数テンプレート引数は、可変数の引数を受け入れる関数を操作する便利な方法を提供します。ただし、各可変長引数で関数を呼び出す再帰チェーンを作成すると、冗長なコードが生成される可能性があります。 C 17 フォールド式または C 17 以前のソリューションを使用してこの問題を解決する方法を次に示します。

C 17 フォールド式:

(f(args), ...);

このフォールド式は次のことができます。すべての可変引数テンプレート引数で関数を呼び出すために使用され、単一の N-arg 関数呼び出しが行われます。

C 17 より前の解決策:

1 。識別子で関数をラップ:

関数を変換して int を返します。これは初期化子リストの仮引数として使用できます:

int print_wrap(const T& t) {
  print(t);
  return 0;
}

2.リスト初期化子の作成:

リスト初期化子を使用して可変引数を展開し、変更された関数を呼び出します:

{ print_wrap(args)... }

3.ヘルパー名前空間を定義します:

このアプローチを再利用可能にするには、ヘルパー名前空間を定義します:

namespace so {
  using expand_type = int[];
}

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }

4.使用法:

SO_EXPAND_SIDE_EFFECTS(f(args));

利点:

  • N 個の引数を持つ関数呼び出しを 1 つだけ生成します。
  • 次の関数をサポートします。オーバーロードされたカンマ演算子。
  • 引数の左から右への評価を保証します。

以上がC 17 の Fold 式はどのようにして可変個引数関数の呼び出しを簡素化できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。