ホームページ  >  記事  >  バックエンド開発  >  C 可変長引数テンプレートで引数をパックおよびアンパックするには、「...」トークンをどのように使用しますか?

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

DDD
DDDオリジナル
2024-10-31 13:43:02945ブラウズ

How do you use the

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

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

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

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

  • パック: 名前の左側に表示される場合、「...」は引数パックを示します。 : ...thing // Pack
  • Unpack: 式の右側に現れる場合、「...」はテンプレート パラメーター パックを展開します: thing... // unpack

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

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

<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>

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

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

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

アンパック パターン

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

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

詳細使用法: 配列の初期化

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

<code class="cpp">struct data_info
{
     boost::any  data;
     std::size_t type_size;
};

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

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

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

以上がC 可変長引数テンプレートで引数をパックおよびアンパックするには、「...」トークンをどのように使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。