Rewrite variant_alternative for g++ 4.8

This commit is contained in:
Peter Dimov
2018-10-18 18:33:22 +03:00
parent 3b1a709def
commit 24d7f83403

View File

@ -101,9 +101,61 @@ template<std::size_t I, class T> struct variant_alternative;
template<std::size_t I, class T> using variant_alternative_t = typename variant_alternative<I, T>::type;
#if BOOST_WORKAROUND(BOOST_GCC, < 40900)
namespace detail
{
template<class I, class T, class Q> using var_alt_impl = mp_invoke<Q, variant_alternative_t<I::value, T>>;
template<std::size_t I, class T, bool E> struct variant_alternative_impl
{
};
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...>, true>
{
using type = mp_at_c<variant<T...>, I>;
};
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> const, true>: std::add_const< mp_at_c<variant<T...>, I> >
{
};
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> volatile, true>: std::add_volatile< mp_at_c<variant<T...>, I> >
{
};
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> const volatile, true>: std::add_cv< mp_at_c<variant<T...>, I> >
{
};
} // namespace detail
template<std::size_t I, class T> struct variant_alternative
{
};
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...>>: public detail::variant_alternative_impl<I, variant<T...>, (I < sizeof...(T))>
{
};
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> const>: public detail::variant_alternative_impl<I, variant<T...> const, (I < sizeof...(T))>
{
};
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> volatile>: public detail::variant_alternative_impl<I, variant<T...> volatile, (I < sizeof...(T))>
{
};
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> const volatile>: public detail::variant_alternative_impl<I, variant<T...> const volatile, (I < sizeof...(T))>
{
};
#else
namespace detail
{
template<class I, class T, class Q> using var_alt_impl = mp_invoke<Q, variant_alternative_t<I::value, T>>;
} // namespace detail
template<std::size_t I, class T> struct variant_alternative
@ -126,6 +178,8 @@ template<std::size_t I, class... T> struct variant_alternative<I, variant<T...>>
{
};
#endif
// holds_alternative
template<class U, class... T> constexpr bool holds_alternative( variant<T...> const& v ) noexcept