diff --git a/include/boost/variant2/variant.hpp b/include/boost/variant2/variant.hpp index fe0bfc7..a831700 100644 --- a/include/boost/variant2/variant.hpp +++ b/include/boost/variant2/variant.hpp @@ -101,9 +101,61 @@ template struct variant_alternative; template using variant_alternative_t = typename variant_alternative::type; +#if BOOST_WORKAROUND(BOOST_GCC, < 40900) + namespace detail { - template using var_alt_impl = mp_invoke>; + +template struct variant_alternative_impl +{ +}; + +template struct variant_alternative_impl, true> +{ + using type = mp_at_c, I>; +}; + +template struct variant_alternative_impl const, true>: std::add_const< mp_at_c, I> > +{ +}; + +template struct variant_alternative_impl volatile, true>: std::add_volatile< mp_at_c, I> > +{ +}; + +template struct variant_alternative_impl const volatile, true>: std::add_cv< mp_at_c, I> > +{ +}; + +} // namespace detail + +template struct variant_alternative +{ +}; + +template struct variant_alternative>: public detail::variant_alternative_impl, (I < sizeof...(T))> +{ +}; + +template struct variant_alternative const>: public detail::variant_alternative_impl const, (I < sizeof...(T))> +{ +}; + +template struct variant_alternative volatile>: public detail::variant_alternative_impl volatile, (I < sizeof...(T))> +{ +}; + +template struct variant_alternative const volatile>: public detail::variant_alternative_impl const volatile, (I < sizeof...(T))> +{ +}; + +#else + +namespace detail +{ + +template using var_alt_impl = mp_invoke>; + } // namespace detail template struct variant_alternative @@ -126,6 +178,8 @@ template struct variant_alternative> { }; +#endif + // holds_alternative template constexpr bool holds_alternative( variant const& v ) noexcept