Ich habe einige generische Code, der mit Flags funktioniert mit C++ 11 enum class
Typen angegeben. Bei einem Schritt möchte ich wissen, ob eines der Bits in der Flagge gesetzt ist. Derzeit verwende ich den Code:Wie kann ich eine Enum-Klasse in einem booleschen Kontext verwenden?
if (flags != static_cast<E>(0)) // Works, but ugly.
ich auch Benutzer zwingen könnte, einen bestimmten Namen für ein All-Null-Feld angeben, die besser lesbar ist, sondern erlegt meine Namenskonventionen für jedermann verwenden es:
if (flags != E::none) // Works, if you manually define none = 0.
Doch diese beiden liest so schön wie die traditionelle:
if (flags) // Doesn't work with class enums.
Ist es möglich, eine benutzerdefinierte Funktion angeben, eine Klasse enum in einem booleschen Kontext zu bewerten?
Gibt es einen bestimmten Grund, warum Sie nicht Binärflags verwenden können? Sie sind sauber und effizient. Wie auch immer, Enum-Klassenwerte können nicht in Zahlen umgewandelt werden. Sie müssen Flags verwenden! = E :: none, wenn Sie aufzählen. Weißt du, du kannst einfach eine Nicht-Enum-Klasse erstellen und statisch const int whatever = 1, statisch const int whatever_else = 2 ... usw. verwenden. und überladen nur ein paar Betreiber. –
@OrgnlDave: "Binäre Flags" was bedeutet, Boole? Als Bitfelder sind sie oft IB/UB und mit regelmäßiger Ausrichtung würde ich sie nicht effizient nennen, noch sauber, wenn ich mehrere gleichzeitig kopieren muss. Ich sehe den Wert nicht, wenn ich statische Ints vorschlage, ich könnte einfach eine normale Enum verwenden und mindestens ein bisschen Typsicherheit bekommen. –
"Ich könnte einfach ein normales Enum verwenden und mindestens ein bisschen Typ-Sicherheit bekommen." Dann müssen Sie akzeptieren, dass Sie damit nicht mehr über Bits sprechen. – GManNickG