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