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

vinodkri

テンプレートは列挙値に基づいて特殊化できますか

#include <type_traits>

template<typename T, typename = void>
struct Specialize
{
};

template<typename T>
struct Specialize<T, typename std::enable_if<std::is_enum<T>::value>::type>
{
    void convert() { }
};

enum E
{
};

int main()
{
    Specialize<E> spec;
    spec.convert();
}

// My doubt: is below code valid? if not how to achieve this?

enum E
{
    E1,
    E2
};

int main()
{
    Specialize<E, E1> spec;
    spec.convert();
}

これは、以下の質問に対する回答のフォローアップ質問です。

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

上記のリンク先の質問への回答からコードをコピーして貼り付けました。

変更すると次のエラーが発生します。

error: type/value mismatch at argument 2 in template parameter list for _template<class T, class>
max66

//私の疑問:以下のコードは有効ですか?

Specialize<E, E1> spec;

短い答え:いいえ。

長い答え。

2つのタイプのテンプレートパラメータを受け取るSpecializedテンプレートとして定義しましたstruct

template<typename T, typename = void>
struct Specialize
{
};

Eはタイプですが、E1です。

そうでない場合、これを達成する方法は?

あなたはあなたのことをしたい場合はstruct/class受信の専門可能テンプレートパラメータ、タイプ、およびその型の値としてstruct/ classIFFを(場合にのみ、ifと)タイプが列挙され、あなたが追加する必要がtypename = void第三テンプレートパラメータとして

template<typename T, T Val, typename = void>
struct Specialize
{
};

template<typename T, T Val>
struct Specialize<T, Val, typename std::enable_if<std::is_enum<T>::value>::type>
{
    void convert() { }
};

C ++ 17以降autoでは、テンプレート値の型として使用し、最初のテンプレートパラメーターを削除することもできます。

template<auto Val, typename = void>
struct Specialize
{
};

template<auto Val>
struct Specialize<Val, std::enable_if_t<std::is_enum_v<decltype(Val)>>>
{
    void convert() { }
};

-編集-

OPは尋ねます

構造体/クラスの外部で関数「変換」をどのように定義しますか?

残念ながら、この場合、std::enable_if繰り返しを回避する方法がわかりません

template <typename T, T Val>
struct Specialize<T, Val,
   typename std::enable_if<std::is_enum<T>::value>::type>
 { void convert(); };

template <typename T, T Val>
void Specialize<T, Val,
   typename std::enable_if<std::is_enum<T>::value>::type>::convert ()
 { };

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

定義とは別にvoidに部分的に特殊化されたテンプレートを実装するにはどうすればよいですか?

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

分類Dev

クラスを特殊化する場合、異なる数のテンプレートパラメータを取得するにはどうすればよいですか?

分類Dev

非型テンプレートクラスを特殊化するために、宣言の外部でメソッドを定義するにはどうすればよいですか?

分類Dev

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

分類Dev

メンバーパラメータへのポインタを持つテンプレートクラスを特殊化するにはどうすればよいですか?

分類Dev

可変個引数を使用してこのテンプレートの特殊化をクラスの友達にするにはどうすればよいですか?

分類Dev

C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

分類Dev

* .cppファイルにテンプレート特殊化メソッドを実装するにはどうすればよいですか?

Related 関連記事

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

    定義とは別にvoidに部分的に特殊化されたテンプレートを実装するにはどうすればよいですか?

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

    関数テンプレートを部分的に特殊化する代わりに、どうすればよいですか?

  23. 23

    クラスを特殊化する場合、異なる数のテンプレートパラメータを取得するにはどうすればよいですか?

  24. 24

    非型テンプレートクラスを特殊化するために、宣言の外部でメソッドを定義するにはどうすればよいですか?

  25. 25

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

  26. 26

    メンバーパラメータへのポインタを持つテンプレートクラスを特殊化するにはどうすればよいですか?

  27. 27

    可変個引数を使用してこのテンプレートの特殊化をクラスの友達にするにはどうすればよいですか?

  28. 28

    C ++ 11では、戻り値の型に基づいて関数オブジェクトを受け取る関数テンプレートを特殊化するにはどうすればよいですか?

  29. 29

    * .cppファイルにテンプレート特殊化メソッドを実装するにはどうすればよいですか?

ホットタグ

アーカイブ