Placement new in generic union class
-
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) <= alignofSieht 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 denreinterpret_cast<T*>verwenden um an einen gültigenT*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?
-
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.