Der C++ Code hier:
http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/pack/container_one_of_maybe.hpp
ist wirklich ein getaggt Union, dass sie doppelte Typen enthalten. Ein nettes Feature ist die Tags Enumerationen; Daher können die Tags sinnvolle Namen haben.
Leider sind die Kompilierzeitkosten ziemlich schlecht, denke ich, weil die Implementierung rekursive Vererbung verwendet. OTOH, vielleicht Compiler werden schließlich einen Weg herauszufinden, um die Kompilierzeit Kosten zu verringern.
OTOH, wenn Sie mit boost :: variant bleiben möchten, können Sie die Typen als Mark B vorschlagen. Anstelle der beschreibenden Klassennamen von Mark B, , die einige Überlegungen erfordern, könnten Sie jedoch fusion::pair<mpl::int_<tag>,T_tag>
verwenden, wobei T_tag
das Tag-te Element in der Quelle fusion::vector
ist. IOW:
variant
< fusion::pair<mpl::int_<1>,T1>
, fusion::pair<mpl::int_<2>,T2>
...
, fusion::pair<mpl::int_<n>,Tn>
>
Da die Fusion docs:
http://www.boost.org/doc/libs/1_55_0/libs/fusion/doc/html/fusion/support/pair.html
sagen, fusion::pair
nur Platz für das Argument 2. Vorlage zuordnet; Daher sollte nicht mehr Platz als boost::variant<T1,T2,...,Tn>
nehmen.
HTH.
-regards, Larry
Warum zwei gleiche "Typ"? Es kann immer nur ein Mitglied einer Vereinigung verwendet werden. – hmjd
Ich weiß, aber es gibt Fälle, wenn Sie disdressing zu Mitglied möchten, selbst wenn sie den gleichen zugrunde liegenden Typ haben. Ein kleines Beispiel wäre ein Expr-Typ mit 2 Mitgliedern IntConst von int und IntMutable von int. – maattdd
Aber es muss irgendwo eine andere Flagge geben (mit 'struct' oder' class'), die angibt, welches Mitglied der Union _active_ ist? Dies könnte verwendet werden, um die zusätzliche erforderliche Bedeutung bereitzustellen. – hmjd