How to use enums as flags in C++?

Treating enums 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.

25 Answers
25

Leave a Comment