「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ 可変長引数テンプレートで引数をパックおよびアンパックするには、「...」トークンをどのように使用しますか?

C++ 可変長引数テンプレートで引数をパックおよびアンパックするには、「...」トークンをどのように使用しますか?

2024 年 11 月 16 日に公開
ブラウズ:146

How do you use the \

可変引数テンプレートの "..." トークンの構文規則

C では、可変引数テンプレートを使用して、引数の可変数。 「...」トークンは、このコンテキストで重要な役割を果たし、引数パックまたはパラメーター アンパッカーのいずれかとして機能します。

省略記号の配置の構文規則

「...」トークンの配置により、その機能が決まります:

  • Pack: name、「...」は引数を示します Pack: ...thing // Pack
  • Unpack: 式の右側にある場合、「...」はアンパックしますテンプレート パラメーター パック: thing... // unpack

例: "..." を含む可変個引数テンプレート

次のことを考えてください。可変個引数テンプレート:

template
unique_ptr make_unique( Args&&... args )
{
    return unique_ptr(new T(std::forward(args)...));
}

この例では、「...」は引数パックとして機能しますが、関数実装の「...」は引数を args 変数に解凍します。

省略記号の配置が異なる理由

テンプレート引数リストとパラメータ リストの間の省略記号の配置の違いは、引数のパッキングとパラメータのアンパッキングの違いによるものです。テンプレート引数リストでは、「...」はパラメータを 1 つのパラメータ パックにパックする必要があることを示しますが、パラメータ リストでは、「...」は引数を個別のパラメータにアンパックする必要があることを示します。

アンパック パターン

アンパッカーとして式の右側に「...」が表示される場合、特定のパターンに従います。パターン:

  • 「...」の左側の式がカンマで区切られて繰り返されます
  • 各繰り返しは、テンプレート パラメーター パックから 1 つの要素を消費する式を表します

高度な使用法: 配列の初期化

省略記号は次の目的にも使用できます。配列の初期化:

struct data_info
{
     boost::any  data;
     std::size_t type_size;
};

std::vector v{{args, sizeof(T)}...}; //pattern = {args, sizeof(T)}

これは、各要素が args と sizeof(T) のペアを含む構造体である値でベクトル v を初期化します。

結論として、可変個引数テンプレートのコンテキスト内の「...」トークンは、配置および解凍パターンの特定の構文規則に従って、引数パックとパラメーター解凍機能の両方として機能します。柔軟な使用法により、強力なテンプレートの構築とカスタマイズが可能になります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3