通常,如果我想通过枚举创建一个模板化(数据)类,我会写这样的东西
addEventListener
然后,如果我希望enum class Modes : int
{
m1 = 1,
m2 = 2,
m3 = 3
};
template <Modes M>
class DataHolder
{
};
template<>
class DataHolder<Modes::m1>
{
public: int a = 4;
};
的专业化与Modes::m1
的专业化相同,我将再次写同样的专业化。有没有办法为多个枚举值编写一个专门化的文字?我已经在SFINAE上尝试过了,但是我没有成功。
Modes::m2
这不能编译。特别是,在我想为template <Modes M, typename = void>
class DataHolder
{
};
template<Modes M, typename = typename std::enable_if<M == Modes::m1 || M == Modes::m2>::type>
class DataHolder
{
public: int a = 4;
};
进行不同的专业化之后。我已经尝试过在SO上找到许多类似的解决方案,但似乎没有任何解决方案。
答案 0 :(得分:10)
您应将enable_if
放在明确的专业化DataHolder
中,该专业化应与默认值匹配。如果enable_if
中的条件评估为true
,将选择专业化。
template <Modes M, typename = void>
class DataHolder
{
};
template<Modes M>
class DataHolder<M, typename std::enable_if<M == Modes::m1 || M == Modes::m2>::type>
{
public: int a = 4;
};
int main()
{
DataHolder<Modes::m1> a; a.a;
DataHolder<Modes::m3> b; /* b.a; */
}