ホームページ > バックエンド開発 > C++ > 省略記号 (...) トークンは C 11 可変個引数テンプレートでどのように機能しますか?

省略記号 (...) トークンは C 11 可変個引数テンプレートでどのように機能しますか?

Barbara Streisand
リリース: 2024-10-30 01:03:28
オリジナル
771 人が閲覧しました

How does the ellipsis (...) token work in C  11 variadic templates?

可変個引数テンプレートと省略記号 ("...") トークン

C 11 では、可変個引数テンプレートにより柔軟な数のテンプレートが可能になりますパラメータ。可変長引数テンプレートを定義する場合、省略記号 (...) トークンは重要な役割を果たします。

アンパックとパッキング

省略記号の位置によってその機能が決まります。

  • アンパック (右側): 式の右側で使用すると、 ... テンプレート パラメーター パックをアンパックします。カンマで区切られたアンパックされたパターンは、実際の関数呼び出しの省略記号を置き換えます。
  • パッキング (左側): 左側に配置すると、 ... 引数がパックされます。テンプレートパラメータパック。パックされた引数は、関数内で単一のエンティティとして使用できます。

アンパックの例

次の可変個引数テンプレート関数を考えてみましょう:

<code class="cpp">template< class T, class... Args >
unique_ptr<T> make_unique( Args&amp;&amp;... args )
{
    return unique_ptr<T>(new T(std::forward<Args>(args)...));
}</code>
ログイン後にコピー

複数の引数を指定して make_unique を呼び出す場合、(std::forward(Args>(args)... の) 省略記号を使用すると、関数は可変数の引数を受け入れることができます。省略記号は Args パラメーター パックを解凍し、その結果、次の展開された式:

<code class="cpp">std::forward<Arg0>(arg0), std::forward<Arg1>(arg1), ...</code>
ログイン後にコピー

テンプレートと関数の引数での省略記号の配置

テンプレート引数リストでは、省略記号がパラメータであることを示すために中央に配置されます。パックは関数パラメーター リストに継続されます。これは、可変個引数パラメーター パックの後に追加のテンプレート パラメーター (非可変個パラメーターなど) が存在する可能性があるためです。

関数の実装では、省略記号が最後に配置されます。これにより、残りの引数が単一のエンティティにパックされずに渡されることが保証されます。

追加のアプリケーション

省略記号次のような他のコンテキストでも使用できます。

  • 可変引数初期化子を使用した配列の作成
  • 複数の基本クラスから継承するクラスの定義 (パブリック Mixins... 構文経由)

以上が省略記号 (...) トークンは C 11 可変個引数テンプレートでどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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