vendredi 23 février 2018

Using switch case for bitwise enums

I have implemented my own typesafe bitwise enum operators following this article: http://blog.bitwigglers.org/using-enum-classes-as-type-safe-bitmasks/

Here is the enum I am talking about:

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
    };

In case you wonder, it's for a logging function.

Problem: I want to use the enum in a switch statement such as

switch(stream)
{
    case OutputStream::Console:
        //Do this
    case OutputStream::File:
        //Do that
    default:
        break;
}

Note that there shouldn't be a break; in between the case statements since more than one case can be true.

However, this doesn't seem to work. More precisely, when I use OutputStream::Console | OutputStream::File neither case is executed.

My only solution to this problem was this awkward looking if statement:

if((stream & OutputStream::Console) != OutputStream::None) { /*Do this*/ }
if((stream & OutputStream::File) != OutputStream::None) { /*Do that*/ }

But for me, this defeats the point of a need enum based solution. What am I doing wrong?

Aucun commentaire:

Enregistrer un commentaire