テンプレートの特殊化が基本テンプレートの子クラスであるかどうかを確認するにはどうすればよいですか?

キエルド・シュミット

クラスがテンプレートの特殊化であるかどうか確認しますか?、クラスがテンプレートの特殊化であるかどうかを確認できます。

を使用してstd::is_convertible<A*, B*>、AがBの子クラスであるかどうかを確認できます。

どのように私は実装することができis_convertible_specialization、どうなる何かを:

template<typename ... Args> 
class Base {};

template<typename ... Args> 
class Child : public Base<Args...> {};

template<typename ... Args>
class Unrelated{};

static_assert( is_convertible_specialization<Child<int, int>, Base>{} ); // True
static_assert( is_convertible_specialization<Unrelated<int, int>, Base>{} ); // False

すでにいくつか試しましたが、TMPのスキルがかなり不足しているので、近づいていないと思います。私の「最善の」試みは次のとおりです。

template<template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization : std::false_type {};

template<template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization<ChildTemplate<Args...>, Template> : std::true_type {
    is_convertible_specialization() {
        static_assert( std::is_convertible<ChildTemplate<Args...> *, Template<Args...> *>());
    }
};

ここでは、私には単純に思える方法でアサーションを「ネスト」しようとします。これにより、次のエラーメッセージが表示されます。これは漠然と理解できるように見えますが、私にはあまり理解できません。

Template argument for template template parameter must be a class template or type alias template

HolyBlackCat

あなたは近かった。

まず、プライマリテンプレートのテンプレートパラメータ(特殊化ではない)は、テンプレートの使用方法と一致している必要があります。

template <typename ChildTemplate, template<class...> class Template>

次に、ポインタが変換可能でない場合、の特殊化is_convertible_specializationfalse静的アサーションをトリガーする代わりに評価する必要があります。これを行うstd::is_convertible_v<...>にはstd::true_type、の代わりにから継承し、カスタムコンストラクターを削除します。

結果は次のとおりです。

template <typename ChildTemplate, template<class...> class Template>
struct is_convertible_specialization : std::false_type {};

template <template<class...> class ChildTemplate, template<class...> class Template, class... Args>
struct is_convertible_specialization<ChildTemplate<Args...>, Template>
    : std::is_convertible<ChildTemplate<Args...> *, Template<Args...> *>
{};

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認しますか?

分類Dev

クラスがテンプレートの特殊化であるかどうかを確認します

分類Dev

既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

分類Dev

クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

分類Dev

部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

分類Dev

列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

分類Dev

クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

分類Dev

std :: string用にテンプレートを特殊化するにはどうすればよいですか

分類Dev

それ自体がテンプレートであり、戻り型のみがテンプレート型に依存する型でテンプレートメソッドを特殊化するにはどうすればよいですか?

分類Dev

関数テンプレートの特殊化を減らすにはどうすればよいですか?

分類Dev

クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

分類Dev

テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

分類Dev

テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

分類Dev

テンプレート引数が与えられた場合、これが実際にパラメータ化されたテンプレートクラスであるかどうかを確認するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

テンプレートクラスの一部の特殊化が特定のクラスの基本クラスであるかどうかを確認する特性

分類Dev

同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

分類Dev

C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

分類Dev

STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

分類Dev

オブジェクトがC ++のテンプレートクラスのインスタンスであるかどうかを確認するにはどうすればよいですか?

分類Dev

typename引数のないテンプレートを特殊化するにはどうすればよいですか?

分類Dev

関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

分類Dev

テンプレートで現在の日付を確認するにはどうすればよいですか?

分類Dev

関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

分類Dev

STLソートを使用して、テンプレートの特殊化を使用してカスタムクラスオブジェクトをソートするにはどうすればよいですか?

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

ユーザーがdjangoテンプレートでオンラインかどうかを確認するにはどうすればよいですか?

分類Dev

パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

Related 関連記事

  1. 1

    クラスがテンプレートの特殊化であるかどうかを確認しますか?

  2. 2

    クラスがテンプレートの特殊化であるかどうかを確認します

  3. 3

    既存のテンプレートクラスを新しいタイプに部分的に特殊化するにはどうすればよいですか?

  4. 4

    クラステンプレートの非型パラメータを部分的に特殊化するにはどうすればよいですか?

  5. 5

    部分的なクラステンプレートの特殊化で継承を実装するにはどうすればよいですか?

  6. 6

    列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

  7. 7

    クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

  8. 8

    std :: string用にテンプレートを特殊化するにはどうすればよいですか

  9. 9

    それ自体がテンプレートであり、戻り型のみがテンプレート型に依存する型でテンプレートメソッドを特殊化するにはどうすればよいですか?

  10. 10

    関数テンプレートの特殊化を減らすにはどうすればよいですか?

  11. 11

    クラステンプレートによって演算子関数タイプを特殊化するにはどうすればよいですか?

  12. 12

    テンプレート化されたクラスの基本クラスに基づいてメンバー関数を特殊化するにはどうすればよいですか

  13. 13

    テンプレート化されていないクラスのテンプレート化されたメンバーメソッドを部分的に特殊化するにはどうすればよいですか?

  14. 14

    テンプレート引数が与えられた場合、これが実際にパラメータ化されたテンプレートクラスであるかどうかを確認するにはどうすればよいですか?

  15. 15

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  16. 16

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  17. 17

    テンプレートクラスの一部の特殊化が特定のクラスの基本クラスであるかどうかを確認する特性

  18. 18

    同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

  19. 19

    C ++「新しい」タイプのテンプレートを特殊化するときに、コンストラクターパラメーターを事前定義するにはどうすればよいですか。

  20. 20

    STLコンテナであるテンプレートパラメータに基づいて、選択したメンバー関数の部分的な特殊化をシミュレートするにはどうすればよいですか?

  21. 21

    オブジェクトがC ++のテンプレートクラスのインスタンスであるかどうかを確認するにはどうすればよいですか?

  22. 22

    typename引数のないテンプレートを特殊化するにはどうすればよいですか?

  23. 23

    関数テンプレートの部分的な特殊化を回避するにはどうすればよいですか?

  24. 24

    テンプレートで現在の日付を確認するにはどうすればよいですか?

  25. 25

    関数テンプレートを「部分的に特殊化」できるように調整するにはどうすればよいですか?

  26. 26

    STLソートを使用して、テンプレートの特殊化を使用してカスタムクラスオブジェクトをソートするにはどうすればよいですか?

  27. 27

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  28. 28

    ユーザーがdjangoテンプレートでオンラインかどうかを確認するにはどうすればよいですか?

  29. 29

    パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

ホットタグ

アーカイブ