パック拡張によるパラメータ パックのループ
可変個引数テンプレートでは、パラメータ パックを使用して関数に渡す引数の数を柔軟に設定できます。 。パラメーター パックを反復しようとしているときに、パックが適切に展開されていない場合、コンパイラ エラーが発生する可能性があります。
次のコードを考えてみましょう:
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 サイトの他の関連記事を参照してください。