C での明示的なテンプレート コンストラクターの呼び出し
初期化子リストでテンプレート コンストラクターを明示的に呼び出すことは、C では困難な場合があります。次の例が提供されていますが、
struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; };
このアプローチは、構文を正しく解釈しようとしないため失敗します。 C 標準 (14.8.1/7) によると、「明示的なテンプレート引数リストは関数テンプレート名に続き、変換メンバー関数テンプレートとコンストラクター メンバー関数テンプレートは関数名を使用せずに呼び出されるため、これらの関数テンプレートには明示的なテンプレート引数リストを提供してください。"
これは、テンプレート引数をコンストラクターに直接渡すことができないことを意味します。ただし、次の回避策があります。
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
この場合、ID 型は仲介者を介してテンプレート引数を効果的にコンストラクターに渡します。
あるいは、C 20 以降では、次のようにすることもできます。 std::type_identity type:
struct T { template<class U> T(std::type_identity<U>); }; struct U { U() : t(std::type_identity<void>()) {} T t; };
を使用します。これらの回避策を利用すると、効果的に初期化できます。 C 標準による制限にもかかわらず、テンプレート コンストラクターを初期化子リストで明示的に使用できます。
以上がC 初期化子リストでテンプレート コンストラクターを明示的に呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。