C++ kod tutaj:
http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/pack/container_one_of_maybe.hpp
to prawdziwy rekord z wariantami, że może zawierać zduplikowane typy. Jedną fajną cechą jest to, że znaczniki mogą być wyliczeniami; w związku z tym znaczniki mogą mieć znaczące nazwy.
Niestety, czas kompilacji jest dość zły, jak sądzę, ponieważ implementacja wykorzystuje dziedziczne dziedziczenie. OTOH, może kompilatory w końcu wymyślą sposób, aby zmniejszyć koszt czasu kompilacji.
OTOH, jeśli chcesz, aby trzymać z boost :: wariantu, można owinąć typy, jak sugeruje Mark B. Jednak zamiast opisowych nazw klas Mark B, , które wymagają pewnej myśli, można użyć fusion::pair<mpl::int_<tag>,T_tag>
gdzie T_tag
jest tag-th elementem w źródle fusion::vector
. IOW:
variant
< fusion::pair<mpl::int_<1>,T1>
, fusion::pair<mpl::int_<2>,T2>
...
, fusion::pair<mpl::int_<n>,Tn>
>
Jak docs fuzyjnych:
http://www.boost.org/doc/libs/1_55_0/libs/fusion/doc/html/fusion/support/pair.html
powiedzieć, fusion::pair
przydziela tylko przestrzeń dla 2nd szablonu argumentu; w związku z tym nie powinno to zająć więcej miejsca niż boost::variant<T1,T2,...,Tn>
.
HTH.
-regards, Larry
Dlaczego dwa tego samego typu? Tylko jeden członek związku może być użyty w tym samym czasie. – hmjd
Wiem, ale są przypadki, kiedy chciałbyś rozproszyć członka, nawet jeśli mają ten sam podstawowy typ. Mały przykład to typ Expr z 2 elementami IntConst int i IntMutable of int. – maattdd
Ale gdzieś musi być gdzieś inna flaga (zawierająca 'struct' lub' class'), która wskazuje, który członek związku jest _aktywny? To może być użyte w celu zapewnienia dodatkowego wymaganego znaczenia. – hmjd