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, der unsigned aber 1. Das ist doch falsches Design.

    Kann man einem int keinen enum mehr zuweisen?



  • @DirkB sagte in enum class Serialisierung:

    @It0101 Warumist der enum für fbInvalid 0, der unsigned aber 1. Das ist doch falsches Design.

    Kann man einem int keinen enum 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 😉


Log in to reply