Я определил перечисление, которое я хочу использовать для хранения флагов в переменных. Цель состоит в том, чтобы иметь возможность установить несколько флагов и проверить, какие из них установлены.
Для этой цели мне понадобятся две операции: одна для определения, если a
в b
, и вторая, чтобы выяснить, не a
не в b
. Я реализовал их, используя перегрузки операторов. Я выбрал <=
и !=
произвольно:
enum Flag { NoFlags, B, C, D=4 };
inline Flag operator |(Flag a, Flag b) {
return static_cast<Flag >(static_cast<int>(a) | static_cast<int>(b)); }
inline bool operator <=(Flag a, Flag b) { return a == (a & b); }
inline bool operator !=(Flag a, Flag b) { return !(a<=b); }
Это отлично работает. Так, например:
Flag flags1 = A|C;
Flag flags2 = B|D;
Flag flags3 = NoFlags|A|B|C|D;
A <= flags1 //true
A != flags2 //true
C != flags3 //false
B <= flags1 //false
Я выбрал <=
и !=
произвольно. Я знаю, что они обычно имеют совершенно разные значения. Вот мне и интересно: