パック拡張を使用してパラメータ パックをループする方法
可変個引数のテンプレートと関数を使用する場合、パックの使用法を理解することが重要です拡張。次のコードを考えてみましょう:
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); }
コンパイル時に、このコードは次のエラーで失敗します:
Error C3520: 'args': parameter pack must be expanded in this context
解決策: Braced-Init-List でのパック展開
この問題に対処するには、パック拡張をbraced-init-list:
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
Braced-Init-List について
配列定義内の初期化子リストは、パック展開をカンマ区切り形式に展開します。リスト。 void へのキャストにより、使用されるカンマ演算子がオーバーロードされたバージョンではなく組み込みのものであることが保証されます。これにより、パック展開の左から右への評価が保証されます。
C 17 の追加オプション
C 17 では、fold を使用してコードを簡素化できます。式:
((void) bar(std::forward<Args>(args)), ...);
結論
C 17 の braced-init-list またはfold 式内のパック展開を利用することで、効果的にループを実行できます。パラメータパックを使用してコンパイルエラーを回避します。この手法を理解することは、C で可変個引数のテンプレートと関数を操作する場合に非常に重要です。
以上が可変個引数テンプレートでパラメーター パックを正しくループする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。