我正在寻找使用一组位标志为我当前的问题。这些标志(很好地)被定义为enum
的一部分,但是我明白,当您从枚举中得到两个值时,OR
操作的返回类型的类型为int
。类型安全枚举位标志
什么目前我正在寻找的是一个解决方案,这将使该位掩码的用户保持类型安全,因此我已经创造了operator |
enum ENUM
{
ONE = 0x01,
TWO = 0x02,
THREE = 0x04,
FOUR = 0x08,
FIVE = 0x10,
SIX = 0x20
};
ENUM operator | (ENUM lhs, ENUM rhs)
{
// Cast to int first otherwise we'll just end up recursing
return static_cast<ENUM>(static_cast<int>(lhs) | static_cast<int>(rhs));
}
void enumTest(ENUM v)
{
}
int main(int argc, char **argv)
{
// Valid calls to enumTest
enumTest(ONE | TWO | FIVE);
enumTest(TWO | THREE | FOUR | FIVE);
enumTest(ONE | TWO | THREE | FOUR | FIVE | SIX);
return 0;
}
以下过载这是否超载真正提供类型安全?包含未在枚举中定义的值的int
是否会导致未定义的行为?是否有任何警告要注意?
'运营商|(五,六)== 0x30'。什么ENUM常量的值为0x30? – Adam
我不会对结果值做任何形式的比较,我只是在检查标志。 – ctor
然后OR的结果应该保持为int。 – Adam