在没有初始化程序的情况下检查C ++枚举是否有多个值

时间:2019-01-25 23:02:10

标签: c++

我有一个C ++枚举,没有可以更改的初始化程序。

enum Foo {A,B,C};

因为它没有使用2的幂进行初始化,所以我无法轻松地使用位运算符来构建掩码等以进行检查(Foo :: A | Foo :: B)。有办法解决吗?

1 个答案:

答案 0 :(得分:1)

除了通过功能或宏将0值包装起来,该函数或宏将位数字转换为掩码或定义要使用的类似名称的常量外,我没有其他方法。

函数/宏的定义非常简单,因为您可以将Foo::X值直接用作位数(并因此用作位移运算符Foo::X的输入)。

这些方法可能如下所示:

<<

另一种方法可能是重载运算符enum Foo {A,B,C}; constexpr unsigned int Foo_A = 1 << Foo::A; constexpr unsigned int Foo_B = 1 << Foo::B; constexpr unsigned int Foo_C = 1 << Foo::C; constexpr unsigned int AsBit(enum Foo f) { return 1 << f; } #define ASBIT(f) (1 << f) int main() { unsigned int val = Foo_A | Foo_C; cout << val << endl; // Output: 5 val = AsBit(Foo::A) | AsBit(Foo::B); cout << val << endl; // Output: 3 val = ASBIT(Foo::B) | ASBIT(Foo::C); cout << val << endl; // Output: 6 } ,但我不鼓励这样做。它将使程序的行为与预期不同:

|