ホームページ >バックエンド開発 >C++ >パック拡張を使用して C パラメータ パックを正しくループするにはどうすればよいですか?

パック拡張を使用して C パラメータ パックを正しくループするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-04 05:41:39151ブラウズ

How Can I Correctly Loop Through a C   Parameter Pack Using Pack Expansion?

パック拡張によるパラメータ パックのループ

提供されたコード スニペットでは、パック展開構文。ただし、コードは「パラメータ パックはこのコンテキストで展開する必要があります。」というエラーでコンパイルに失敗します。

この問題を解決するには、パック展開が許可されているコンテキスト内に配置する必要があります。適切な場所の 1 つは、中括弧付き初期化リスト内です。次の変更されたコードを考えてみましょう:

template<typename... Args>
static void foo2(Args &&... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}

その仕組みは次のとおりです:

  • ダミー配列の初期化子リスト内のコードは、{} で囲まれています。
  • パック拡張構文は初期化子リスト内で使用されます。具体的には、 ( (void) bar(std::forward(args)), 0) がパック内の各パラメーターに対して展開されます。
  • 各式を区切るためにカンマ演算子が使用され、 bar() 関数はパラメータごとに呼び出されます。
  • 括弧で囲まれています。 bar(std::forward(args)) は、結果を void にキャストするために使用されます。これにより、オーバーロードされたものではなく、組み込みのカンマ演算子が使用されることが保証されます。
  • パラメーター パックが空の場合に不正な長さ 0 の配列が作成されるのを避けるために、少なくとも 1 つの要素を含むダミー配列が作成されます。

この変更により、コードは正常にコンパイルされ、パラメーター パックをループします。

C 17 Fold 式

C 17 では、Fold 式を使用してコードを簡略化できます。

((void) bar(std::forward<Args>(args)), ...);

この式はパックを展開し、指定された操作を適用します (この場合、 bar()) 左から右。

以上がパック拡張を使用して C パラメータ パックを正しくループするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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