Boost logo

Boost :

Subject: Re: [boost] [bind]bind question
From: Nathan Ridge (zeratul976_at_[hidden])
Date: 2012-05-27 13:41:32


> >>> I have the following code:
> >>>
> >>> bool do_something_conditional(int *handle, const
> >>> boost::function<bool(int)> &pred); bool pred_a(int handle); bool
> >>> pred_b(int handle, int n1, int n2);
> >>>
> >>> bool do_something(int *handle, int n1, int n2) {
> >>> return do_something_conditional(handle,
> >>> boost::bind(std::logical_and<bool>(),
> >>> boost::not1(&pred_a),
> >>> boost::bind(&pred_b, _1, n1, n2))); }
> >>>
> >>> But it does not compile.
> >>
> >> This should work and is probably clearer:
> >>
> >> return do_something_conditional(handle,
> >> boost::bind(std::logical_and<bool>(),
> >> !boost::bind(&pred_a, _1),
> >> boost::bind(&pred_b, _1, n1, n2)));
> >
> > Yes, it works.
> >
> > Thank you, Ben.
> >
> > But why is my way wrong? With either boost::not1(&pred_a) or
> > !boost::bind(&is_master_device, _1) we get a functor that takes 1 parameter
> > of type int.
>
> I don't know. I think there is some kind of voodoo in boost::bind that
> means the outer bind will evaluate the inner bind, bot won't try to
> evaluate not1.

The "voodoo" is described here: http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#nested_binds

Basically, bind treats nested binds specially, precisely to allow the
sort of thing the OP's trying to do.

Regards,
Nate
                                               


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk