6 #ifndef MISC_GENERIC_VARIANT_HXX
7 # define MISC_GENERIC_VARIANT_HXX
9 # include <boost/variant/get.hpp>
10 # include <boost/preprocessor/repetition/repeat_from_to.hpp>
11 # include <boost/preprocessor/punctuation/comma.hpp>
16 # define MISC_GENERIC_VARIANT_PARAMS \
17 typename T0_ BOOST_PP_COMMA() BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)
18 # define MISC_GENERIC_VARIANT_TYPE \
19 generic_variant<T0_ BOOST_PP_COMMA() BOOST_VARIANT_ENUM_SHIFTED_PARAMS(T)>
23 # define MISC_GENERIC_VARIANT_CONVERSION_OPERATOR_DEF(z, N, T) \
24 template <MISC_GENERIC_VARIANT_PARAMS> \
25 MISC_GENERIC_VARIANT_TYPE::operator BOOST_PP_CAT(T,N) & () \
27 return boost::get<BOOST_PP_CAT(T,N)>(*this); \
30 # define MISC_GENERIC_VARIANT_CONST_CONVERSION_OPERATOR_DEF(z, N, T) \
31 template <MISC_GENERIC_VARIANT_PARAMS> \
32 MISC_GENERIC_VARIANT_TYPE::operator const BOOST_PP_CAT(T,N) & () const \
34 return boost::get<BOOST_PP_CAT(T,N)>(*this); \
42 template <MISC_GENERIC_VARIANT_PARAMS>
43 MISC_GENERIC_VARIANT_TYPE::generic_variant() : super_type()
51 template <MISC_GENERIC_VARIANT_PARAMS>
53 MISC_GENERIC_VARIANT_TYPE::generic_variant(
const U& rhs) : super_type(rhs)
57 template <MISC_GENERIC_VARIANT_PARAMS>
60 MISC_GENERIC_VARIANT_TYPE::operator=(
const U& rhs)
63 if (static_cast<const void*>(&rhs) == static_cast<const void*>(
this))
65 super_type::operator=(rhs);
70 template <MISC_GENERIC_VARIANT_PARAMS>
71 MISC_GENERIC_VARIANT_TYPE::operator T0_& ()
73 return boost::get<T0_>(*this);
78 , BOOST_VARIANT_LIMIT_TYPES
86 return boost::get<T0_>(*this);
91 , BOOST_VARIANT_LIMIT_TYPES
98 # undef MISC_GENERIC_VARIANT_CONVERSION_OPERATOR_DEF
99 # undef MISC_GENERIC_VARIANT_CONST_CONVERSION_OPERATOR_DEF
100 # undef MISC_GENERIC_VARIANT_TYPE
101 # undef MISC_GENERIC_VARIANT_PARAMS
103 #endif // !MISC_GENERIC_VARIANT_HXX