Boost logo

Boost Users :

Subject: Re: [Boost-users] How to write a predicate for mpl::find_if that is able to work with placeholders?
From: Michael Schulze (mschulze_at_[hidden])
Date: 2010-09-21 15:22:43


> I solved it. I crawled through the mpl sources (not an easy task) and
> found how it has to work.
>
> The predicate needs to be defined as:
>
> template<typename A, typename B>
> struct contained
> {
> static const int value=is_same<typename A::slot_id, B>::value;
> template<typename T1, typename T2>
> struct apply;
> };
I tested again and I realized that the nested apply may be omitted and
it works also as it should.

>> template<int i>
>> struct Slot {
>> typedef Slot type;
>> typedef int_<i> slot_id;
>> };
>> typedef vector<Slot<0>, Slot<10>, Slot<15> > slots;
>> typedef find_if<slots, contained< _1, int_<10> > >::type t10;
>> BOOST_MPL_ASSERT(( is_same< deref<t10>::type, Slot<10> > ));
>
> This works as intended. However, finding out how to write such a
> predicate, was very hard. Providing examples, describing the different
> kinds of predicates and how they need to be written in order to work
> with placeholders, would be very helpful. Maybe such things could be
> added to the mpl documentation, because I am sure, I am not the first
> that came up with such an issue.
>
> Regards,
> Michael


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net