boost::variant reimplementieren
-
Hallo
Ich reimplementiere gerade ein paar Sachen der
STDund vonboost. Nun, als ich soeben mitboost::variantbeginnen wollte, komme ich nicht vom Fleck. Wie arbeitet es intern?MfG, EOutOfResources
-
is doch opensource
-
Uh, das sieht ja schrecklich aus. Ich dachte, die nutzen irgend einen Metaprogrammierungs-Trick.
-
EOutOfResources schrieb:
Ich dachte, die nutzen irgend einen Metaprogrammierungs-Trick.
Tun sie garantiert.
-
Ich kenne boost::variant nicht, ist das sowas ähnliches wie boost::any?
-
Nicht wirklich - es ist eher die C++-Version einer union.
-
Im Prinzip benutzen sie ein
char-Array, desses Größe die Maximalgröße aller Typen im Variant ist und dessen Alignment ebenfalls dem maximalen Alignment aller beteiligten Typen entspricht. Dahinein werden dann die entsprechenden Objekte konstruiert.
Von welchem Typ das aktuelle Objekt ist, merkt man sich mit einer simplen Indexvariable (die den Index in der Typliste speichert), deren Typ abhängt von der Zahl der Typen ist (normalerweiseunsigned char, bei mehr als 256 Typenunsigned int).
Dabei wird natürlich auch viel Metaprogrammierung benutzt.
Das Visitor-Pattern ist schlussendlich nur ein hinter viel Metaprogrammierung verstecktesswitchauf den Typindex.Das sollte für den Anfang erstmal reichen. Danach kommen dann noch Implementierungsfeinheiten z.B. bezüglich der Never-Empty-Garantie.