一个模板专门化几个枚举值

Cro*_*man 6 c++ templates template-specialization c++11

通常,如果我想通过枚举创建一个模板(数据)类,我会写这样的东西

enum class Modes : int
{
    m1 = 1,
    m2 = 2,
    m3 = 3
};

template <Modes M>
class DataHolder
{
};

template<>
class DataHolder<Modes::m1>
{
    public: int a = 4;
};
Run Code Online (Sandbox Code Playgroud)

然后,如果我想的一样专业化Modes::m1作为Modes::m2我再次写相同的专业化.有没有办法为几个枚举值写一个专门化?我用SFINAE尝试过,但我不是成功的.

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;
};
Run Code Online (Sandbox Code Playgroud)

这不会编译.特别是在我想继续进行不同的专业化之后Modes::m3.我在SO上尝试了许多类似的解决方案,但似乎没有解决问题.

Vit*_*meo 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; */
}
Run Code Online (Sandbox Code Playgroud)

godbolt.org上的实例