Я пытался и искал, и я думаю, что лучшее решение - #define. На основании что-то, что я нашел :
#define FLAGS(T) \
inline T operator |(const T s, const T e) { return (T)((unsigned)s | e); } \
inline T &operator |=(T &s, const T e) { return s = s | e; } \
inline T operator &(const T s, const T e) { return (T)((unsigned)s & e); } \
inline T &operator &=(T &s, const T e) { return s = s & e; } \
inline T operator ^(const T s, const T e) { return (T)((unsigned)s ^ e); } \
inline T &operator ^=(T &s, const T e) { return s = s ^ e; } \
inline T operator ~(const T s) { return (T)~(unsigned)s; }
Это можно использовать как:
enum some_state {
state_normal = 1 << 0,
state_special = 1 << 1,
state_somethingelse = 1 << 2,
state_none = 0,
};
FLAGS(some_state)
some_state var1;
Для Visual Studio это может понадобиться, чтобы отключить некоторые предупреждения:
#pragma warning(disable: 4505) // '*' : unreferenced local function has been removed
Фактически, Windows SDK имеет макрос DEFINE_ENUM_FLAG_OPERATORS
, чтобы сделать это.
Другой подход - это класс-оболочка , например DEF_ENUM_FLAGS_TYPE
использует .
Или используйте что-то вроде макроса LLVM_MARK_AS_BITMASK_ENUM
. Возможно, вам понадобится недавний компилятор.