通常,如果我想通过枚举创建一个模板化(数据)类,我会写这样的东西
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