如果我有一个普通(弱)枚举,我可以将其枚举值用作非类型模板参数,如下所示:
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)
,这似乎是多余的。
有什么办法可以避免同时输入枚举类和值,短
#define MAGIC(E, T) (magic<decltype(E), E>(T));