はじめに
C 17 では、「テンプレート推論ガイド、これは、コンストラクターのテンプレート引数推定を強化する上で極めて重要な役割を果たします。この機能は、テンプレートを使用してオブジェクトを構築する際に、適切なテンプレート パラメータを推測するという課題に対処します。
テンプレート推論ガイドとは何ですか?
テンプレート推論ガイドは、テンプレートに関連付けられたパターンです。クラス。これらは、コンストラクターに渡された引数を対応するテンプレート パラメーターに変換する際にコンパイラーをガイドします。基本的に、コンパイラがコンストラクターの引数に基づいてどのテンプレート特殊化をインスタンス化するかを決定するためのルールを確立します。
テンプレート推論ガイドを使用する理由とタイミング
テンプレート推論ガイドテンプレート パラメーターをコンストラクターの引数の型から直接推論できない場合に必要です。この状況は、テンプレート引数が単一の引数の型から派生していない場合に発生します。たとえば、反復子のペアを受け取る std::vector のコンストラクターの場合を考えてみましょう:
template<typename Iterator> void func(Iterator first, Iterator last) { vector v(first, last); }
この例では、ベクターの T テンプレート パラメーターの型を反復子の引数から直接推論できません。推論ガイドを使用して、正しい特殊化が Vector
テンプレート推論ガイドの宣言
テンプレート推論ガイドは次を使用して宣言されます。構文:
template class_name(constructor_args) -> template_args;
例
std::vector の演繹ガイドの例を考えてみましょう:
template<typename Iterator> vector(Iterator b, Iterator e) -> vector<typename std::iterator_traits<Iterator>::value_type>;
このガイドはコンパイラーに次のことを指示します。 (反復子ペア) コンストラクター パターンを使用して std::vector を構築する場合、テンプレート引数 T typename std::iterator_traits
集約初期化ガイドとテンプレート推定ガイド
興味深いことに、テンプレート推定ガイドは次のものでも使用できます。集合体と集合体初期化:
template<typename T> struct Thingy { T t; }; Thingy(const char *) -> Thingy<std::string>; Thingy thing{"A String"}; //thing.t is a `std::string`.
この例では、テンプレート推論ガイドを使用して、集約コンストラクターに渡された文字列リテラルの型に基づいて Thingy のテンプレート パラメーター T を推論します。
結論
テンプレート推論ガイドは、テンプレート化されたオブジェクトを構築するときに型推論を可能にする強力なツールです。コンストラクターの引数をテンプレート パラメーターに変換する方法を明示的に定義することで、プログラマはテンプレートのインスタンス化のプロセスを大幅に簡素化し、コードの可読性を向上させることができます。
以上がC 17 テンプレート演繹ガイドはテンプレート引数演繹をどのように改善しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。