25#include <boost/mpl/begin_end.hpp>
26#include <boost/mpl/deref.hpp>
27#include <boost/mpl/next.hpp>
35template <
class Iterator,
class End,
template <
typename>
class Predicate,
36 template <
typename>
class F,
class State>
42template <
class Iterator,
class End,
template <
typename>
class Predicate,
43 template <
typename>
class F,
class State>
46 if (Predicate<
typename boost::mpl::deref<Iterator>::type>{}(state)) {
47 F<typename boost::mpl::deref<Iterator>::type>{}(state);
51 using NextIterator =
typename boost::mpl::next<Iterator>::type;
53 return find_if_impl<NextIterator, End, Predicate, F>(
54 std::forward<State>(state),
55 typename std::is_same<NextIterator, End>::type{});
59template <
class Sequence,
template <
typename>
class Predicate,
60 template <
typename>
class F,
class State>
63 return detail::find_if_impl<typename boost::mpl::begin<Sequence>::type,
64 typename boost::mpl::end<Sequence>::type,
66 std::forward<State>(state),
67 typename std::is_same<typename boost::mpl::begin<Sequence>::type,
68 typename boost::mpl::end<Sequence>::type>::type{});