我已经按照本文实现了我自己的类型安全按位枚举运算符:http://blog.bitwigglers.org/using-enum-classes-as-type-safe-bitmasks/
这是我所说的enum:
enum class OutputStream : unsigned int
{
None = 0,
// Using bitshift operator (always one bit set to 1)
Console = 1 << 0,
File = 1 << 1,
Other = 1 << 2
};
如果你想知道,它是一个记录功能。
问题: 我想在switch语句中使用枚举,例如
switch(stream)
{
case OutputStream::Console:
//Do this
case OutputStream::File:
//Do that
default:
break;
}
请注意,案例陈述之间不应该是break;
,因为不止一个案例可以成立。
然而,这似乎不起作用。更准确地说,当我使用OutputStream::Console | OutputStream::File
时,两种情况都不会被执行。
我唯一能解决这个问题的方法就是这个尴尬的陈述:
if((stream & OutputStream::Console) != OutputStream::None) { /*Do this*/ }
if((stream & OutputStream::File) != OutputStream::None) { /*Do that*/ }
但是对我来说,这会破坏基于需求枚举的解决方案。我做错了什么?
答案 0 :(得分:1)
正如其他人在评论中所说,切换不是最佳方式,但仍有可能做到:
for (int bit = 1; bit <= (int) OutputStream::LAST; bit <<= 1)
{
switch((OutputStream) (bit & stream))
{
case OutputStream::Console:
//Do this
break;
case OutputStream::File:
//Do that
break;
// etc...
// no default case no case 0!
}
}
所以基本上你会遍历所有单独的位,对于每个测试,如果它存在于stream
变量中并跳转到适当的case
,或者如果它为0则跳转到任何位置。
但在我看来,个人ifs更好。至少你可以更好地控制评估位的顺序。