【问题标题】:One template specialization for several enum values多个枚举值的一种模板特化
【发布时间】:2018-11-28 16:23:48
【问题描述】:

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

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::m1Modes::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 上尝试了许多类似的解决方案,但似乎没有解决问题。

【问题讨论】:

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


    【解决方案1】:

    您应该将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

    【讨论】:

    • 啊,如此接近,却又如此遥远。
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2023-02-11
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多