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
|
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>*... );
|
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
|
} // 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>
|
// mp_from_sequence<S>
|
||||||
namespace detail
|
namespace detail
|
||||||
|
@@ -27,6 +27,7 @@ int main()
|
|||||||
using boost::mp11::mp_drop;
|
using boost::mp11::mp_drop;
|
||||||
using boost::mp11::mp_drop_c;
|
using boost::mp11::mp_drop_c;
|
||||||
using boost::mp11::mp_size_t;
|
using boost::mp11::mp_size_t;
|
||||||
|
using boost::mp11::mp_valid;
|
||||||
|
|
||||||
{
|
{
|
||||||
using L1 = mp_list<>;
|
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((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();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user