通常,如果我想通过枚举拥有一个模板化(数据)类,我会写这样的东西
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
。我已经尝试过在此处找到的许多类似的解决方案,但似乎没有任何解决方案。
你应该把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; */
}
godbolt.org 上的实例 https://gcc.godbolt.org/z/rIZZeo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)