我有一个C ++枚举,没有可以更改的初始化程序。
enum Foo {A,B,C};
因为它没有使用2的幂进行初始化,所以我无法轻松地使用位运算符来构建掩码等以进行检查(Foo :: A | Foo :: B)。有办法解决吗?
答案 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
}
,但我不鼓励这样做。它将使程序的行为与预期不同:
|