Tony the Pony Tony the Pony - 4 months ago 16
C++ Question

How to use enums as flags in C++?

Treating

enum
s as flags works nicely in C# via the
[Flags]
attribute, but what's the best way to do this in C++?

For example, I'd like to write:

enum AnimalFlags
{
HasClaws = 1,
CanFly =2,
EatsFish = 4,
Endangered = 8
};

seahawk.flags = CanFly | EatsFish | Endangered;


However, I get compiler errors regarding
int
/
enum
conversions. Is there a nicer way to express this than just blunt casting? Preferably, I don't want to rely on constructs from 3rd party libraries such as boost or Qt.

EDIT: As indicated in the answers, I can avoid the compiler error by declaring
seahawk.flags
as
int
. However, I'd like to have some mechanism to enforce type safety, so someone can't write
seahawk.flags = HasMaximizeButton
.

Answer

The "correct" way is to define bit operators for the enum, as:

enum AnimalFlags
{
    HasClaws = 1,
    CanFly =2,
    EatsFish = 4,
    Endangered = 8
};

inline AnimalFlags operator|(AnimalFlags a, AnimalFlags b)
{return static_cast<AnimalFlags>(static_cast<int>(a) | static_cast<int>(b));}

Etc. rest of the bit operators. Modify as needed if the enum range exceeds int range.

Comments