テンプレートは列挙値に基づいて特殊化できますか
#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>
//私の疑問:以下のコードは有効ですか?
Specialize<E, E1> spec;
短い答え:いいえ。
長い答え。
2つのタイプのテンプレートパラメータを受け取るSpecialized
テンプレートとして定義しましたstruct
template<typename T, typename = void>
struct Specialize
{
};
E
はタイプですが、E1
は値です。
そうでない場合、これを達成する方法は?
あなたはあなたのことをしたい場合はstruct
/class
受信の専門可能テンプレートパラメータ、タイプ、およびその型の値としてstruct
/ class
IFFを(場合にのみ、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]
コメントを追加