【发布时间】:2019-01-11 11:04:05
【问题描述】:
我有两个基础类型为uint32_t 的枚举。我需要他们的 constexpr OR 运算符,因为一些成员应该与其他成员的 OR 结果一致。我想避免两次或多次实现运算符。
所以,我尝试使用模板来实现它。
template <enum class E>
constexpr uint32_t operator|(const E& left, const E& right)
{
return (uint32_t)left | (uint32_t)right;
}
template <enum class E>
constexpr uint32_t operator|(const uint32_t& left, const E& right)
{
return left | (uint32_t)right;
}
enum class U32Enum1 : uint32_t {
OtherMember1 = 0x01L,
OtherMember2 = 0x02L,
SomeOfMember = OtherMember1 | OtherMember2 // Not work
}
enum class U32Enum2 : uint32_t {
OtherMember1 = 0x01L,
OtherMember2 = 0x02L,
SomeOfMember = OtherMember1 | OtherMember2 // Not work
}
但是,它不起作用,编译器给了我一条消息,指出运算符 | 没有匹配的操作数。我怎样才能做到这一点?
【问题讨论】:
-
请提供minimal reproducible example和错误信息
-
不能转换为基础类型,然后简单地将现有的
operator|用于uint32_t吗? -
@user463035818 示例中仅描述了两个成员,但此情况涉及更多成员。我可以将它们中的每一个都转换为底层类型,但是它会弄乱代码。
标签: c++ enums operator-overloading