ホームページ > バックエンド開発 > C++ > コンパイラ エラーを回避するために C パラメータ パックを正しく反復するにはどうすればよいですか?

コンパイラ エラーを回避するために C パラメータ パックを正しく反復するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-17 15:07:09
オリジナル
287 人が閲覧しました

How Can I Correctly Iterate Over a C   Parameter Pack to Avoid Compiler Errors?

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

可変個引数テンプレートでは、パラメータ パックを使用して関数に渡す引数の数を柔軟に設定できます。 。パラメーター パックを反復しようとしているときに、パックが適切に展開されていない場合、コンパイラ エラーが発生する可能性があります。

次のコードを考えてみましょう:

template<typename... Args>
static void foo2(Args... args)
{
    (bar(args)...); // Error: parameter pack must be expanded
}
ログイン後にコピー

このコードはエラーでコンパイルに失敗します。 「エラー C3520: 'args': パラメータ パックはこのコンテキストで展開する必要があります。」このエラーの理由は、パラメータ パック args を bar 関数呼び出し内で使用する前に展開する必要があるためです。

この展開を実現する 1 つの方法は、braced-init-list を利用することです。 (中かっこで囲まれた初期化リスト)。ダミー配列の初期化子リスト内に展開を配置することで、コンパイラは必要な展開を実行できます。

template<typename... Args>
static void foo2(Args &&&... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}
ログイン後にコピー

初期化子リストによりパック全体を展開でき、void へのキャストによりコンマが確実に展開されます。 bar の戻り型のオーバーロードされた演算子に関係なく、演算子が使用されます。

C 17 で導入された代替アプローチは、次の使用です。 fold Expressions:

((void) bar(std::forward<Args>(args)), ...);
ログイン後にコピー

このコードは、パラメーター パックをループするための簡潔かつ効率的な方法を提供します。

以上がコンパイラ エラーを回避するために C パラメータ パックを正しく反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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