Il codice C++ qui:
http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/pack/container_one_of_maybe.hpp
è veramente un sindacato etichettato in quanto può contenere tipi di duplicati. Una bella caratteristica è che i tag possono essere enumerazioni; di conseguenza, i tag possono avere nomi significativi.
Sfortunatamente, il costo del tempo di compilazione è piuttosto negativo, suppongo, perché l'implementazione utilizza l'ereditarietà ricorsiva. OTOH, forse i compilatori alla fine troveranno un modo per ridurre il costo del tempo di compilazione.
OTOH, se si desidera attenersi a boost :: variant, è possibile includere i tipi, come suggerito da Mark B. Tuttavia, al posto dei nomi descrittivi delle classi di Mark B, che richiedono qualche riflessione, è possibile utilizzare fusion::pair<mpl::int_<tag>,T_tag>
dove è l'elemento tag-th nell'origine fusion::vector
. IOW:
variant
< fusion::pair<mpl::int_<1>,T1>
, fusion::pair<mpl::int_<2>,T2>
...
, fusion::pair<mpl::int_<n>,Tn>
>
Come la documentazione di fusione:
http://www.boost.org/doc/libs/1_55_0/libs/fusion/doc/html/fusion/support/pair.html
dicono, fusion::pair
assegna spazio solo per l'argomento secondo modello; di conseguenza, questo non deve prendere alcuna stanza più di boost::variant<T1,T2,...,Tn>
.
HTH.
-regards, Larry
Perché due dello stesso 'tipo'? Solo un membro di un sindacato può essere utilizzato in qualsiasi momento. – hmjd
Lo so, ma ci sono casi in cui vorresti distrarre i membri anche se hanno lo stesso tipo di sottotitoli. Un piccolo esempio potrebbe essere un tipo Expr con 2 membri IntConst di int e IntMutable di int. – maattdd
Ma ci deve essere qualche altro flag da qualche parte (contenente 'struct' o' class') che indica quale membro del sindacato è _active_? Questo potrebbe essere usato per fornire il significato aggiuntivo richiesto. – hmjd