C++ код здесь:
http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/pack/container_one_of_maybe.hpp
действительно помеченный союз в том, что он может содержать повторяющиеся типы. Одна приятная функция - это теги, которые могут быть перечислены; следовательно, теги могут иметь значащие имена.
К сожалению, время компиляции довольно плохое, я думаю, потому что реализация использует рекурсивное наследование. OTOH, возможно, компиляторы в конечном итоге выяснят способ , чтобы уменьшить затраты времени на компиляцию.
OTOH, если вы хотите придерживаться boost :: variant, вы можете обернуть типы, , как предложил Mark B. Однако вместо описательных имен класса Mark B , которые требуют некоторой мысли, вы можете использовать fusion::pair<mpl::int_<tag>,T_tag>
, где T_tag
является тегом-элементом в источнике fusion::vector
. IOW:
variant
< fusion::pair<mpl::int_<1>,T1>
, fusion::pair<mpl::int_<2>,T2>
...
, fusion::pair<mpl::int_<n>,Tn>
>
Как слитых документы:
http://www.boost.org/doc/libs/1_55_0/libs/fusion/doc/html/fusion/support/pair.html
говорят, fusion::pair
только выделяет пространство для 2-го аргумента шаблона; следовательно, это не должно занимать больше места, чем boost::variant<T1,T2,...,Tn>
.
HTH.
-regards, Ларри
Почему два одинаковых типа? Только один член союза может использоваться в любой момент времени. – hmjd
Я знаю, но есть случаи, когда вы хотели бы относиться к члену, даже если они имеют один и тот же базовый тип. Небольшим примером может быть тип Expr с 2 членами IntConst из int и IntMutable из int. – maattdd
Но должен быть какой-то другой флаг где-нибудь (содержащий 'struct' или' class'), который указывает, какой член объединения _active_? Это можно использовать для обеспечения дополнительного требуемого значения. – hmjd