Если у меня обычное (слабое) перечисление, я могу использовать его перечисляемые значения как параметры шаблона, не относящиеся к типу, например:
enum { Cat, Dog, Horse };
template <int Val, typename T> bool magic(T &t)
{
return magical_traits<Val>::invoke(t);
}
и называть его как: magic
насколько я понимаю, если у меня строго типизированное перечисление и я не хочу жестко кодировать тип перечисления, я получаю:
enum class Animal { Cat, Dog, Horse };
template <typename EnumClass, EnumClass EnumVal, typename T> bool magic(T &t)
{
return magical_traits<EnumVal>::invoke(t);
}
и теперь мне нужно написать: magic
, что кажется лишним.
Есть ли способ избежать ввода и класса enum, и значения, кроме
#define MAGIC(E, T) (magic<decltype(E), E>(T));