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

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的特化与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;
};

这不会编译。特别是在我想对Modes::m3进行不同的特化之后。我已经尝试过在SO上找到许多类似的解决方案,但是似乎没有任何解决方案。

最佳答案

您应该将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; */
}

live example on godbolt.org

10-04 15:03