Wie kann ich eine enum-Klasse in einem booleschen Kontext?

Habe ich einige generische code, der funktioniert mit den flags angegeben, die mit C++11 enum class Arten. In einem Schritt, ich würde gerne wissen, ob irgendwelche bits im flag gesetzt sind. Derzeit bin ich mit dem code:

if (flags != static_cast<E>(0)) //Works, but ugly.

Konnte ich mich auch zwingen Benutzer, um geben Sie einen bestimmten Namen für einen all-null-Feld, das ist mehr lesbar, aber schränkt meine Namenskonventionen auf jeden es zu benutzen:

if (flags != E::none) //Works, if you manually define none = 0.

Aber weder dieser liest sich so schön wie die traditionellen:

if (flags) //Doesn't work with class enums.

Ist es möglich, geben Sie eine benutzerdefinierte Funktion auswerten eine Klasse enum in einem booleschen Kontext?

  • Gibt es einen bestimmten Grund, warum Sie nicht verwenden können, binäre flags? Sie sind sauber und effizient. Jedenfalls, enum-Klasse können keine Werte in zahlen umgewandelt werden. Sie haben auf die use-flags != E::keine wenn Sie aufzählen. Sie wissen, können Sie nur eine nicht-enum-Klasse und mit static const int was = 1, static const int whatever_else = 2...usw. und überlastung nur wenige Betreiber.
  • flags", was bedeutet was, bools? Als bitfields sind Sie oft IB/UB und mit der regelmäßigen Ausrichtung, ich würde nicht nennen Sie effizient, noch sauber, wenn ich brauche zu kopieren mehrere Dateien auf einmal. Ich sehe nicht den Wert in was static ints, konnte ich nur mit einem enum-und zumindest ein wenig Typ-Sicherheit.
  • "Ich konnte nur mit einem enum-und zumindest ein wenig Typ-Sicherheit." Dann müssen Sie akzeptieren, dass zusammen mit, dass Sie nicht mehr zu sprechen, über die bits.
  • Nein, habe ich nicht; eines der grundlegenden Punkte der enum-Klassen ist, dass Sie typesafe Möglichkeiten der Benennung einer bestimmten (set) - Wert-Darstellung(en). Es ist absolut gut zu sprechen, sowohl von bits und Typ-Sicherheit.
  • Sie reden über bits, die von bestimmten benannten Konstanten, sicher, aber nicht über die enum-Wert im Allgemeinen. Dies ist durch design und eine Gute Sache.
  • Enum-Klassen entfernen der implizite cast auf int, aber nicht verstecken oder ändern Sie den Wert der Repräsentation. Sie noch den Wert angeben, buchstäblich, können Sie immer noch static_cast eher als reinterpret_cast, und Sie können immer noch std::underlying_type.
  • In der Tat, wir Stimmen alle dafür. Aber diese Dinge existieren nur, um von enum zu den zugrunde liegenden Typ und zurück, nicht zu gehen von einem bestimmten Allgemeinen Wert des zugrunde liegende Typ der Enumeration.

InformationsquelleAutor | 2012-03-26
Schreibe einen Kommentar