我切换了我的宏(这是糟糕的,让小孩子害怕,像谷歌said)来限制枚举。我认为有一个范围枚举很棒。然后我写了这个:
if ((msg.Stamp & RECEIVERS::BROADCAST) != RECEIVERS::BROADCAST)
^^^^^^^^^^^^^^^^^^^^
//do stuff
和intellisense给我一个奇怪的错误,例如:"表达式必须具有整数类型或未包含的枚举"。为什么我不能按位和使用作用域枚举?
答案 0 :(得分:2)
你可以,但你必须编写自己的运算符重载
RECEIVERS operator&(RECEIVERS l, RECEIVERS r)
{
using underlying = typename std::underlying_type<RECEIVERS>::type;
return static_cast<RECEIVERS>(static_cast<underlying>(l) & static_cast<underlying>(r));
}
内置二进制文件operator&
仅适用于整数类型和未范围的枚举类型。 Scoped枚举类型对如何使用它们有限制,它们的行为不像整数,所以(默认情况下)它们只支持一组有限的操作。
除此之外:类型名称RECEIVERS
对我来说太可怕了,Receivers
出了什么问题?我不喜欢将ALL_CAPS用于枚举器常量的惯例,但我更喜欢它的类型名称。