// Мое сомнение: приведенный ниже код действителен?
Specialize<E, E1> spec;
Краткий ответ: №
Длинный ответ.
Вы определили Specialized
как шаблон struct
, получив два типа параметры шаблона
template<typename T, typename = void>
struct Specialize
{
};
E
- это тип, но E1
- это значение .
если нет, как этого добиться?
Если вы хотите, чтобы ваш struct
/ class
получил в качестве параметров шаблона,тип и значение этого типа, что позволяет специализацию struct
/ class
, если (если и только если) тип является перечислением, вы должны добавить 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() { }
};
- EDIT -
ОП спрашивает
как бы мы определили функцию "преобразовать" вне структуры / класса?
К сожалению, я не вижу пути,в этом случае, чтобы избежать повторения std::enable_if
Tition
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 ()
{ };