forked from boostorg/mp11
Make mp_drop and mp_drop_c SFINAE friendly.
This commit is contained in:
@@ -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
|
||||
|
@@ -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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user