From c1287f9e957692f58aa3bb2166d7ce5f429b511a Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 21 Feb 2019 23:06:24 +0200 Subject: [PATCH] Fix variant_alternative for g++ 4.8 --- include/boost/variant2/variant.hpp | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/include/boost/variant2/variant.hpp b/include/boost/variant2/variant.hpp index 23ce723..8cb7ad8 100644 --- a/include/boost/variant2/variant.hpp +++ b/include/boost/variant2/variant.hpp @@ -137,10 +137,34 @@ template struct variant_alternative_impl struct variant_alternative_impl const&, true>: std::add_lvalue_reference< mp11::mp_at_c, I> const > +{ +}; + +template struct variant_alternative_impl volatile&, true>: std::add_lvalue_reference< mp11::mp_at_c, I> volatile > +{ +}; + +template struct variant_alternative_impl const volatile&, true>: std::add_lvalue_reference< mp11::mp_at_c, I> const volatile > +{ +}; + template struct variant_alternative_impl&&, true>: std::add_rvalue_reference< mp11::mp_at_c, I> > { }; +template struct variant_alternative_impl const&&, true>: std::add_rvalue_reference< mp11::mp_at_c, I> const > +{ +}; + +template struct variant_alternative_impl volatile&&, true>: std::add_rvalue_reference< mp11::mp_at_c, I> volatile > +{ +}; + +template struct variant_alternative_impl const volatile&&, true>: std::add_rvalue_reference< mp11::mp_at_c, I> const volatile > +{ +}; + } // namespace detail template struct variant_alternative @@ -167,10 +191,34 @@ template struct variant_alternative& { }; +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))> +{ +}; + 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