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

C 初期化子リストでテンプレート コンストラクターを明示的に呼び出すにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 04:56:12539ブラウズ

How Can I Explicitly Invoke a Template Constructor in a C   Initializer List?

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 サイトの他の関連記事を参照してください。

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