可変個引数テンプレート: 省略記号の謎を明らかにする
C 11 で導入された可変個引数テンプレートは、関数と可変数の引数を受け入れて処理するクラス。ただし、その構文の特定の側面は好奇心を呼び起こす可能性があります。そのような謎の 1 つは、謎めいた「省略記号」 (...) 表記です。これにより、その目的と使用法についての疑問が生じます。
可変個引数テンプレートのコンテキストでは、省略記号 (...) は重要なツールとして機能します。引数とパラメータの パッキング または アンパック のいずれかです。その役割は、テンプレート定義または呼び出し内の相対位置によって決まります。
アンパック: パラメーターを引数に展開
式の右側に配置される場合、省略記号はアンパッカーとして機能します。これにより、テンプレート パラメーターを一連の実引数に展開できます。たとえば、次の関数テンプレートでは:
<code class="cpp">template<class T, class... Args> unique_ptr<T> make_unique(Args&&... args) { return unique_ptr<T>(new T(std::forward<Args>(args)...)); }</code>
std::forward
パッキング: 引数をパラメータに結合する
逆に、パラメータの左側に配置された場合、省略記号は パッカー。一連の引数を 1 つのパラメーターにパックします。このパッキングは、テンプレート引数の推論と関数呼び出しの呼び出しの両方で発生します。
説明のために、次の関数呼び出しを考えてみましょう。<code class="cpp">make_unique<int>(1, 2, 3);</code>make_unique
<code class="cpp">template <typename ...T> void f(T ...args) { g(args...); // Unpacking: Pattern = args h(x(args)...); // Unpacking: Pattern = x(args) m(y(args...)...); // Packing: Pattern = args (arg to y()) }</code>呼び出し時T が {int, char, short} の場合、各関数呼び出しは次のように展開されます。
<code class="cpp">g(arg0, arg1, arg2); h(x(arg0), x(arg1), x(arg2)); m(y(arg0, arg1, arg2));</code>
配置の不一致
配置に明らかな不一致があることに気づくかもしれません。テンプレート引数リストと関数パラメータリストの間の省略記号。テンプレート引数ではパラメータ パックの途中に表示され、関数パラメータでは最後に表示されます。この違いは、テンプレート引数では省略記号がパラメータ パックのアンパックを表す構文糖であるのに対し、関数パラメータでは構文の一部 パックされた引数の型を定義します。 要約すると、可変個引数テンプレートの省略記号 (...) は、パラメーターを引数に拡張し、引数をパラメーターに結合する際に重要な役割を果たし、さまざまな数の引数を処理できる柔軟で拡張可能なコードの作成を可能にします。
以上が「省略記号」 (...) 表記は可変個引数テンプレートでどのように機能しますか?また、引数のパックとアンパックにおけるそのさまざまな役割は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。