mirror of
https://github.com/boostorg/variant2.git
synced 2025-07-31 20:54:28 +02:00
Rewrite variant_alternative for g++ 4.8
This commit is contained in:
@@ -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;
|
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
|
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
|
} // namespace detail
|
||||||
|
|
||||||
template<std::size_t I, class T> struct variant_alternative
|
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
|
// holds_alternative
|
||||||
|
|
||||||
template<class U, class... T> constexpr bool holds_alternative( variant<T...> const& v ) noexcept
|
template<class U, class... T> constexpr bool holds_alternative( variant<T...> const& v ) noexcept
|
||||||
|
Reference in New Issue
Block a user