C では、クラス コンストラクター内のオブジェクトを初期化するときに、明示的なテンプレート コンストラクターをどのように呼び出すことができますか?次の例を考えてみましょう。
struct T { template<class> T(); }; struct U { U() : t<void>() {} // This approach does not work T t; };
提供されたコードは、U の初期化子リスト内で T のテンプレート コンストラクターを明示的に呼び出そうとします。ただし、このアプローチは失敗します。
初期化子リストでのテンプレート コンストラクターの明示的な呼び出しは、 C ではサポートされていません。この制限は、テンプレート引数が通常、関数テンプレート名の後に山括弧を使用して指定されるという事実に起因します。コンストラクターには独自の名前がないため、コンストラクターにテンプレート引数を渡す従来の方法はありません。
C 標準では、セクション 14.8.1/7 でこの制限について明示的に説明しています。
[Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. ]
1 つの回避策は、ヘルパー型を利用してテンプレート引数を型 ID を受け入れるコンストラクターへの引数。例:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
この場合、Boost で定義された ID テンプレートを使用して、テンプレート引数をラップできます。あるいは、C 20 では、std::type_identity 型を使用できます。
以上がC 初期化子リストでテンプレート コンストラクターを明示的に呼び出す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。