Boost logo

Boost :

Subject: Re: [boost] [bind]bind question
From: Ben Pope (benpope81_at_[hidden])
Date: 2012-05-27 09:43:26


On Sunday, May 27, 2012 08:12 PM, Max wrote:
>>> 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.

It would be interesting to see what std::bind does, it tends to have
less voodoo.

Ben


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