Boost logo

Boost :

Subject: Re: [boost] [bind]bind question
From: Peter Dimov (pdimov_at_[hidden])
Date: 2012-05-27 20:32:22


Ben Pope wrote:

> 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)));

Or even

return do_something_conditional(handle,
    !boost::bind(&pred_a, _1) && boost::bind(&pred_b, _1, n1, n2) );

As for the original error,

error C2664: 'bool std::logical_and<_Ty>::operator ()(const _Ty &,const _Ty
&) const' : cannot convert parameter 1 from 'boost::unary_negate<Predicate>'
to 'const bool &'

the compiler is right, logical_and doesn't accept boost::not1(&pred_a) as a
first argument, it takes a bool. To make it compile, one needs to wrap
boost::not1(&pred_a) in a boost::bind, as follows:

bool do_something(int *handle, int n1, int n2)
{
    return do_something_conditional(handle,
        boost::bind(std::logical_and<bool>(),
            boost::bind(boost::not1(&pred_a), _1),
            boost::bind(&pred_b, _1, n1, n2)));
}

This will call boost::not1(&pred_a) with _1 instead of passing it as-is to
logical_and.


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