【发布时间】:2012-03-13 02:56:11
【问题描述】:
如果我有一个普通(弱)枚举,我可以将其枚举值用作非类型模板参数,如下所示:
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));
【问题讨论】:
-
为什么不
template <EnumClass EnumVal, typename T> bool magic(T &t)?你打算将其他类型的枚举传递给这个函数吗?我不认为你是,因为magical_traits<>本身只接受一个参数,这没有意义。 -
嗯,我过度简化了这个例子:是的,这个想法是处理多个枚举类而不重复。很遗憾,因为如果我将 value 作为函数参数传递,它可以很好地推断枚举类,但如果它是模板参数则不能。
-
事实上,这正是
enum classes 的意义所在,每个类型都不同,并且与int之类的东西特别不同。 -
真;很遗憾,对于与此处的类型参数相同的非类型参数,推导不起作用。我可以从单个指向成员的参数中推断出包含的类和成员类型,但是对于强类型的枚举参数,没有办法做到这一点。
-
为什么不只是
template <Animal a,typename T> bool magic(T &t)?
标签: c++ templates c++17 strong-typing template-argument-deduction