enum class Serialisierung
-
Hi zusammen
wie serialisiert ihr Enums?
Ich lande irgendwie immer bei sowas:
enum class foobar { fbInvalid = 0, fbSuperCool, fbMegaDeath }; unsigned serializeMyEnum( foobar fb_value ) { switch ( fb_value ) { case foobar::fbInvalid : return 1; case foobar::fbSuperCool: return 2; case foobar::fbMegaDeath : return 3; default : return 0; } }
Nachteil dieser switches ist natürlich die Schreibarbeit und die Fehlerquote, wenn man ein enum erweitert und dabei die Erweiterung der Serialisierung vergisst.
Gibt es da Alternativen?
(Compilerunabhängig, Plattformunabhängig )
-
@It0101 Warumist der
enum
für fbInvalid 0, derunsigned
aber 1. Das ist doch falsches Design.Kann man einem
int
keinenenum
mehr zuweisen?
-
@DirkB sagte in enum class Serialisierung:
@It0101 Warumist der
enum
für fbInvalid 0, derunsigned
aber 1. Das ist doch falsches Design.Kann man einem
int
keinenenum
mehr zuweisen?Falsches Design würde ich nicht sagen.
Ich nehme einfach den returncode 0 als Fehler, weil dann ganz offensichtlich vergessen wurde einen Enum im switch zu berücksichtigen.
-
Naja wenn es nur darum geht ein enum class als integer zu serialisieren reicht auch ein
unsigned serializeMyEnum( foobar fb_value ) { return static_cast<unsigned>(fb_value) }
-
@firefly sagte in enum class Serialisierung:
Naja wenn es nur darum geht ein enum class als integer zu serialisieren reicht auch ein
unsigned serializeMyEnum( foobar fb_value ) { return static_cast<unsigned>(fb_value) }
Bei genau der Variante war ich mir halt unsicher, ob das auf allen compilern möglich ist.
Der Standard legt ja nicht fest, durch was ein enum im Speicher repräsentiert wird. Könnte ja auch ein String sein... Oder ist das ausgeschlossen? ( abgesehen davon, dass es verrückt wäre )
-
eigentlich heißt es ja enum und nicht estring, oder?
-
Siehe https://en.cppreference.com/w/cpp/language/enum bei "Scoped enumerations" Abschnitt (1)
Der unterliegende Typ von enum classes ohne benutzdefinierte Typ-Bezeichnung ist int.
Bei enum ohne class/struct ist es immerhin auch noch garantiert ein integral type (implementation-defined). Siehe auf der verlinkten Seite weiter oben).
-
Ok danke. Dann werde ich auf nummer sicher gehen und den Typ selber festlegen und dann müsste ich eigentlich sauber sein