一种模板专用化,可用于多个枚举值

时间:2018-11-28 16:23:48

标签: c++ c++11 templates template-specialization

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

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上找到许多类似的解决方案,但似乎没有任何解决方案。

1 个答案:

答案 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; */
}

live example on godbolt.org