ホームページ > バックエンド開発 > C++ > 可変個引数テンプレートでパラメーター パックを正しくループする方法

可変個引数テンプレートでパラメーター パックを正しくループする方法

Patricia Arquette
リリース: 2024-12-27 16:42:10
オリジナル
567 人が閲覧しました

How to Correctly Loop Over a Parameter Pack in Variadic Templates?

パック拡張を使用してパラメータ パックをループする方法

可変個引数のテンプレートと関数を使用する場合、パックの使用法を理解することが重要です拡張。次のコードを考えてみましょう:

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 サイトの他の関連記事を参照してください。

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