How can I overload the |=
operator on a strongly typed (scoped) enum
(in C++11, GCC)?
I want to test, set and clear bits on strongly typed enums. Why strongly typed? Because my books say it is good practice. But this means I have to static_cast<int>
everywhere. To prevent this, I overload the |
and &
operators, but I can't figure out how to overload the |=
operator on an enum. For a class you'd simply put the operator definition in the class, but for enums that doesn't seem to work syntactically.
This is what I have so far:
enum class NumericType
{
None = 0,
PadWithZero = 0x01,
NegativeSign = 0x02,
PositiveSign = 0x04,
SpacePrefix = 0x08
};
inline NumericType operator |(NumericType a, NumericType b)
{
return static_cast<NumericType>(static_cast<int>(a) | static_cast<int>(b));
}
inline NumericType operator &(NumericType a, NumericType b)
{
return static_cast<NumericType>(static_cast<int>(a) & static_cast<int>(b));
}
The reason I do this: this is the way it works in strongly-typed C#: an enum there is just a struct with a field of its underlying type, and a bunch of constants defined on it. But it can have any integer value that fits in the enum's hidden field.
And it seems that C++ enums work in the exact same way. In both languages casts are required to go from enum to int or vice versa. However, in C# the bitwise operators are overloaded by default, and in C++ they aren't.
PadWithZero | NegativeSign = 0x03
which is not a valid enumerated constant. – Bandwidthprintf
. Does the result have to be a member of the original enumeration? I come from a C# background and expected scoped enums to behave like those in C#. – Often|
, so it doesn't make sense to coerce it into an (illegal value of) that type. Enumerate the flag constant values, but let a combination of flags be an int. – Bandwidth0x03
illegal? It isn't one of the listed types, but I'm not aware of a restriction ofenum class
that makes0x03
undefined behavior when stored in thatenum class
... – Aquacade