Placement new in generic union class



  • Arcoth schrieb:

    Genauso würde ich niemals

    if (a & 2)
    

    schreiben um auszudrücken, dass a eine gerade Ganzzahl ist, nur weil der Standard festlegt, dass nur Ganzzahlrepresentierungen verwendet werden dürfen die derartiges unterstützen.

    würde ich auch nicht, aber aus einem anderen Grund.
    (Tip: !(a&1))


  • Mod

    Wenn ein armer Programmierer das jetzt nicht weiss, und deinen Code liest, und das Programm erweitern muss...
    und dann davon ausgeht dass er überall mit allen möglichen Alignment Requirements rechnen muss...

    Bin nicht dran gewohnt oder ausgerichtet mit Leuten zu arbeiten, die unbegründete Annahmen aus einer Code-Zeile entnehmen und auf dieser Basis ein Projekt erweitern/umschreiben.

    großbuchstaben schrieb:

    würde ich auch nicht, aber aus einem anderen Grund.
    (Tip: !(a&1))

    Ups, da war ich im Eifer des Gefechts ganz woanders, sorry. Es hilft nicht, dass ich gerade mit etwas völlig anderem Beschäftigt bin.

    hustbaer schrieb:

    volkard schrieb:

    Hast anscheinend die 15 Jahre, die die meisten dafür brauchen, auf nur 5 drücken können.

    Ich finde die Entwicklung von HaSoCoth ... erstaunlich. Ernsthaft. 👍@Arcoth

    Klingt zynisch. Und da ich annehmen darf, dass ein Gentlemen wie du nicht aus Versehen zynisch ist...



  • Daran war nichts zynisch gemeint.
    Du musst ja auch selbst merken wie sich z.B. der Ton mit dem wir uns unterhalten MASSIV verbesser hat in den letzten Jahren.

    ps: Falls du dich am "HaSoCoth" gestossen hast - das war nicht böse gemeint. Der kleine Insiderwitz sei mir bitte verziehen 🙂



  • Arcoth schrieb:

    Wenn ein armer Programmierer das jetzt nicht weiss, und deinen Code liest, und das Programm erweitern muss...
    und dann davon ausgeht dass er überall mit allen möglichen Alignment Requirements rechnen muss...

    Bin nicht dran gewohnt oder ausgerichtet mit Leuten zu arbeiten, die unbegründete Annahmen aus einer Code-Zeile entnehmen und auf dieser Basis ein Projekt erweitern/umschreiben.

    Das selbe Argument funktioniert auch für den Standpunkt dass deine Variante unnötig kompliziert ist, und auch ein einfaches a <= b ohne weiteres Kommentar völlig ausreicht.

    Wenn ich deinen Code - ohne weiteres Kommentar - irgendwo lesen würde, dann würde es mich kurz verwirren. Und danach würde ich mir denken "weiss der nicht dass a <= b reicht, oder macht er Dinge einfach gerne unnötig kompliziert?".



  • hustbaer schrieb:

    alignof(T) == alignof
    alignof(T) <= alignof

    Sieht sonst OK aus.
    Und primitive Typen kannst du auch einfach per gecastetem Zeiger da rein schreiben bzw. wieder rauslesen.

    Wie kann ich einen Wert (double, und custom type) in einem std::aligned_storage
    speichern und wieder rausholen?



  • struct Foo
    {
        template <class T> void put_trivial(T t)
        {
            *reinterpret_cast<T*>(&m_storage) = t;
        }
    
        template <class T> T get_trivial() const
        {
            return *reinterpret_cast<T const*>(&m_storage);
        }
    
        std::aligned_storage<...>::type m_storage;
    };
    

    Und nicht triviale Typen dann entsprechend mit placement new , bzw. nach dem das Objekt einmal erstellt ist kannst du genau so den reinterpret_cast<T*> verwenden um an einen gültigen T* Zeiger zu kommen.



  • Also ich hab inzwischen sowas hier:

    struct Foo
    {
        template <class T> void put_trivial(T t)
        {
            reinterpret_cast<T&>(m_storage) = t;
        }
    
        template <class T> T get_trivial() const
        {
            return reinterpret_cast<T const&>(m_storage);
        }
    
        std::aligned_storage<...>::type m_storage;
    };
    

    und für Pointer:

    struct Foo
    {
        template <class T> void put_trivial(T* t)
        {
            reinterpret_cast<T*&>(m_storage) = t;
        }
    
        template <class T> T* get_trivial() const
        {
            return reinterpret_cast<T const*&>(m_storage);
        }
    
        std::aligned_storage<...>::type m_storage;
    };
    

    Das ist doch auch okay, oder?



  • Ne. Ka. was das darstellen soll.

    ps: Wenn du davon so überhaupt keinen Plan hast, wäre es dann nicht besser du suchst dir ne andere Beschäftigung?


  • Mod

    Nash26 schrieb:

    Also ich hab inzwischen sowas hier:

    ...
    

    Das const im zweiten get_trivial dürfte an der falschen Stelle stehen. Den Code einfach mal zu kompilieren mit einer bestimmten Instantiierung.



  • hustbaer schrieb:

    Ne. Ka. was das darstellen soll.

    ps: Wenn du davon so überhaupt keinen Plan hast, wäre es dann nicht besser du suchst dir ne andere Beschäftigung?

    Was meinst du damit, "Keine Ahnung"?
    Statt das Objekt zu einem Pointer zu casten und dann zu dereferenzieren, cast ich es direkt zu einer Objekt Referenz.

    Ist das Falsch?

    PS: Deine zweite Bemerkung finde ich unangebracht in einem Forum. Für mich ist das der Sinn eines Forums. Fragen zu stellen, sich auszutauschen um Dinge zu erfahren von dem man keinen Plan hat.



  • Ja, du hast Recht, sorry.

    Ich finde es halt irgendwie komisch dass du dich über etwas mMn. einigermassen kompliziertes, wie einen Variant mit eingebautem Speicher, drübertraust, wenn du dir bei vielen Dingen hinsichtlich OK/nicht OK nicht sicher bist.
    (Wenn das kein Produktivcode werden soll sondern bloss zu Lernzweckendient nehme ich alles zurück und behaupte das Gegenteil.)

    Nash26 schrieb:

    Statt das Objekt zu einem Pointer zu casten und dann zu dereferenzieren, cast ich es direkt zu einer Objekt Referenz.

    Vielleicht bin auch ich hier der der keine Ahnung hat 😃
    Ich mache sowas grundsätzlich über Zeiger, weil bei Referenzen manchmal komische Dinge erlaubt sind. Wie die Erzeugung von Temporaries.
    Was aber in diesem Fall vermutlich doch gar kein Problem ist.

    Was ich aber nach wie vor komisch finde ist dass du zwei verschiedene Templates machst für nicht-Zeiger und Zeiger. Das ist nicht nötig. Zeiger sind ganz normale "triviale" Objekte und können auch ganz normal mit den ersten beiden Templates verwendet werden.
    Was automatisch auch den "const-Position" Fehler vermieden hätte.


Anmelden zum Antworten