1
0
forked from boostorg/mp11

Make mp_drop and mp_drop_c SFINAE friendly.

This commit is contained in:
Jody Hagins
2022-12-06 11:37:42 -05:00
parent f6133a9f1f
commit 811efd6820
2 changed files with 14 additions and 4 deletions

View File

@@ -291,9 +291,9 @@ template<class Q, class... L> using mp_product_q = typename detail::mp_product_i
namespace detail
{
template<class L, class L2> struct mp_drop_impl;
template<class L, class L2, class> struct mp_drop_impl;
template<template<class...> class L, class... T, template<class...> class L2, class... U> struct mp_drop_impl<L<T...>, L2<U...>>
template<template<class...> class L, class... T, template<class...> class L2, class... U> struct mp_drop_impl<L<T...>, L2<U...>, mp_true>
{
template<class... W> static mp_identity<L<W...>> f( U*..., mp_identity<W>*... );
@@ -304,9 +304,9 @@ template<template<class...> class L, class... T, template<class...> class L2, cl
} // namespace detail
template<class L, std::size_t N> using mp_drop_c = typename detail::mp_drop_impl<L, mp_repeat_c<mp_list<void>, N>>::type;
template<class L, std::size_t N> using mp_drop_c = typename detail::mp_drop_impl<L, mp_repeat_c<mp_list<void>, N>, mp_bool<N <= mp_size<L>::value>>::type;
template<class L, class N> using mp_drop = typename detail::mp_drop_impl<L, mp_repeat<mp_list<void>, N>>::type;
template<class L, class N> using mp_drop = mp_drop_c<L, N::value>;
// mp_from_sequence<S>
namespace detail

View File

@@ -27,6 +27,7 @@ int main()
using boost::mp11::mp_drop;
using boost::mp11::mp_drop_c;
using boost::mp11::mp_size_t;
using boost::mp11::mp_valid;
{
using L1 = mp_list<>;
@@ -81,5 +82,14 @@ int main()
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_drop<L1, mp_size_t<0>>, L1>));
}
{
BOOST_TEST_TRAIT_TRUE((mp_valid<mp_drop, mp_list<X1, X2, X3>, mp_size_t<0>>));
BOOST_TEST_TRAIT_TRUE((mp_valid<mp_drop, mp_list<X1, X2, X3>, mp_size_t<1>>));
BOOST_TEST_TRAIT_TRUE((mp_valid<mp_drop, mp_list<X1, X2, X3>, mp_size_t<2>>));
BOOST_TEST_TRAIT_TRUE((mp_valid<mp_drop, mp_list<X1, X2, X3>, mp_size_t<3>>));
BOOST_TEST_TRAIT_FALSE((mp_valid<mp_drop, mp_list<X1, X2, X3>, mp_size_t<4>>));
BOOST_TEST_TRAIT_FALSE((mp_valid<mp_drop, mp_list<X1, X2, X3>, mp_size_t<5>>));
}
return boost::report_errors();
}