多个枚举值的一个模板专业化
One template specialization for several enum values
通常,如果我想通过枚举获得模板化(数据)class,我会写这样的东西
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; */
}
通常,如果我想通过枚举获得模板化(数据)class,我会写这样的东西
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; */
}