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