forked from boostorg/mp11
Make mp_replace(_if) SFINAE-friendlier.
This commit is contained in:
@@ -337,27 +337,18 @@ template<class L, class N> using mp_take = typename detail::mp_take_impl<L, N>::
|
|||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 )
|
|
||||||
|
|
||||||
template<class L, class V, class W> struct mp_replace_impl;
|
template<class L, class V, class W> struct mp_replace_impl;
|
||||||
|
|
||||||
template<template<class...> class L, class... T, class V, class W> struct mp_replace_impl<L<T...>, V, W>
|
template<template<class...> class L, class... T, class V, class W> struct mp_replace_impl<L<T...>, V, W>
|
||||||
{
|
{
|
||||||
|
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 )
|
||||||
template<class A> struct _f { using type = mp_if<std::is_same<A, V>, W, A>; };
|
template<class A> struct _f { using type = mp_if<std::is_same<A, V>, W, A>; };
|
||||||
|
|
||||||
using type = L<typename _f<T>::type...>;
|
using type = L<typename _f<T>::type...>;
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
template<class L, class V, class W> struct mp_replace_impl
|
|
||||||
{
|
|
||||||
template<class A> using _f = mp_if<std::is_same<A, V>, W, A>;
|
template<class A> using _f = mp_if<std::is_same<A, V>, W, A>;
|
||||||
|
using type = L<_f<T>...>;
|
||||||
using type = mp_transform<_f, L>;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
@@ -367,11 +358,12 @@ template<class L, class V, class W> using mp_replace = typename detail::mp_repla
|
|||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<class L, template<class...> class P, class W> struct mp_replace_if_impl
|
template<class L, template<class...> class P, class W> struct mp_replace_if_impl;
|
||||||
{
|
|
||||||
template<class T> using _f = mp_if<P<T>, W, T>;
|
|
||||||
|
|
||||||
using type = mp_transform<_f, L>;
|
template<template<class...> class L, class... T, template<class...> class P, class W> struct mp_replace_if_impl<L<T...>, P, W>
|
||||||
|
{
|
||||||
|
template<class U> using _f = mp_if<P<U>, W, U>;
|
||||||
|
using type = L<_f<T>...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
Reference in New Issue
Block a user