ホームページ > バックエンド開発 > C++ > C 初期化子リストでテンプレート コンストラクターを明示的に呼び出す方法は?

C 初期化子リストでテンプレート コンストラクターを明示的に呼び出す方法は?

Linda Hamilton
リリース: 2024-11-27 08:28:10
オリジナル
651 人が閲覧しました

How to Explicitly Invoke Template Constructors in C   Initializer Lists?

初期化リストでのテンプレート コンストラクターの明示的な呼び出し

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 型を使用できます。

Reference

  • [std::type_identity](https://en.cppreference.com/w) /cpp/types/type_identity)

以上がC 初期化子リストでテンプレート コンストラクターを明示的に呼び出す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート