Вывод аргументов шаблона со строго типизированными перечислениями

Если у меня обычное (слабое) перечисление, я могу использовать его перечисляемые значения как параметры шаблона, не относящиеся к типу, например:

enum { Cat, Dog, Horse };

template <int Val, typename T> bool magic(T &t)
{
    return magical_traits<Val>::invoke(t);
}

и называть его как: magic (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 (t) , что кажется лишним.

Есть ли способ избежать ввода и класса enum, и значения, кроме

#define MAGIC(E, T) (magic<decltype(E), E>(T));
23
задан Deduplicator 21 October 2018 в 23:55
поделиться