【发布时间】:2018-11-10 13:00:37
【问题描述】:
我已经定义了一个枚举,我想用它来在变量中存储标志。目的是能够设置多个标志,并能够检查设置了哪些标志。
为此,我需要两个操作:一个是找出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
我随意选择了<= 和!=。我知道它们通常具有完全不同的含义。所以我想知道:
是否存在使用其他运算符表示这两个操作的普遍接受的做法?
或者使用函数而不是运算符重载会更好?
【问题讨论】:
-
通常不鼓励为与现有含义完全不相似的运算符编造自己的含义,因为这违反了最小惊讶原则。 (有些人甚至说 iostreams
operator<<和operator>>是一个错误,尽管在这一点上它们已经很成熟并且普遍被理解。)我会使用命名函数。 -
@MatthieuBrucher 枚举类型保证能够在最大枚举值之后存储最接近 2 减一幂的值,因此实际上将枚举值的按位或组合强制转换为枚举类型。
-
@aschepler 这实际上是对一个完全有效的问题的一个很好的答案。就这样发布,我会更新
-
是的,谢谢,这就是我真正需要知道的一切。如果作为答案发布,我会接受。
-
@bur 有一些反对票和接近票可能是因为有些人不明白你对旗帜和运营商的意思。我稍作编辑以使其更清晰。如果我弄错了,请随时纠正。
标签: c++ enums operator-overloading flags