使用switch case进行按位枚举

时间:2018-02-23 18:40:22

标签: c++ c++11 enums bitwise-operators

我已经按照本文实现了我自己的类型安全按位枚举运算符: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*/ }

但是对我来说,这会破坏基于需求枚举的解决方案。我做错了什么?

1 个答案:

答案 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更好。至少你可以更好地控制评估位的顺序。