Kurze Frage zu Unions



  • Hey Community,

    wie der Titel bereits sagt, habe ich eine kurze Frage zu Unions. Ich habe DERMAßEN wenig mit Unions bisher gerabeitet, ich bin mir echt nicht 100% sicher. Kurz zu meinem Problem:

    Ich habe eine Klasse die einen "Header" repräsentiert, von dem später einige Informationen in ein File geschrieben werden. Darunter sind Offsets in dem File die wahlweise in 32 oder 64 Bit Länge (uint32_t / uint64_t) geschrieben werden. Welche Länge es am Ende ist bleibt unabhängig vom darunterliegendem System dem Coder überlassen.

    Anfangs hatte ich den Datentyp der Offsets über ein Templateargument festgelegt, in etwa so:

    template<typename TOffsetType>
    class SomeHeader
    {
        TOffsetType _offset;
    };
    

    Um es nun zumindest ein wenig einzuschänken, dass der Coder später einen Typ an das Template übergibt der kurzerhand ungleich 32/64 Bit lang ist, habe ich das ganze mit Type-Traits realisiert, funktioniert auch soweit wie gewünscht.

    Jetzt kam mir das alles am Ende allerdings recht "aufegbläht" und unhandlich vor, und da ist mir die Idee gekommen das so kurzerhand so zu implementieren:

    class SomeHeader
    {
        bool is64;
    
        union
        {
            uint8_t raw[8];
            uint32_t l32;
            uint64_t l64;
        }_offset;
    };
    

    Mal ganz unabhängig davon, dass es bei verschiedenen Systemen ein Endianness Problem geben kann (darum kümmere ich mich beim Schreiben/Lesen in und aus dem File), ist das eine akzeptable Lösung (oder gar eine bescheuerte) und gibt es da eventuell Probleme im Sinne der Portabilität?

    Falls jemand einen noch ganz anderen Ansatz hat, immer her damit.

    Danke für etwaige Antworten!

    Gruß
    PuerNoctis

    EDIT: Ups, kleine Anpassung im Code



  • Ich würde auf unions verzichten, weil das ganze ziemlich unsicher ist.

    Du verhinderst hiermit nicht, dass du l32 schreibst aber auf l64 zugreifst, weil du dies nicht überprüfen kannst.

    Ich würde Templates nutzen und default implementation bereitstellen



  • Laut standard sind nur die "gemeinsam" verwendeten bytes definiert!



  • Hmhmhm... ja, das ist mir glaube ich echt etwas zu heikel. Ich werde das denke ich, wie Seikilos bereits vorgeschlagen hat, weiterhin mit meinen Templates und TypeTraits machen.


Anmelden zum Antworten