
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