|
Boost Users : |
From: Rodolfo Lima (rodolfo_at_[hidden])
Date: 2007-03-14 19:03:38
Sorry, I answered your message a little too quick. Actually sample::odd is a
member function, so you have to write if_then(bind(&sample::odd, _1) ==
false, std::cout << _1)
&_1->*&sample::odd would work if sample::odd was an attribute, not a member
function. Remember to use lambda's bind (i.e. boost::lambda::bind), not
boost::bind.
Let me know if this works.
Regards,
rodolfo
"Boris" <boriss_at_[hidden]> escreveu na mensagem news:op.to4s8qi39dsao3_at_burk...
> On Tue, 13 Mar 2007 00:21:36 +0200, Rodolfo Lima <rodolfo_at_[hidden]>
> wrote:
>
>>> // Why doesn't this compile ...
>>> std::for_each(from.begin(), from.end(), if_then((_1 ->* &sample::odd) ==
>>> false, std::cout << _1));
>>
>> IMO it should be &1->*&sample::odd
>>
>> The ->* operator expects a pointer in its left side. Since & has higher
>> priority than ->*, it suffices to add & to _l and it'll work.
>
> I played around some more and even removed the comparison with false. But
> neither this ...
>
> std::for_each(from.begin(), from.end(), if_then(boost::lambda::_1 ->*
> &sample::odd, std::cout << boost::lambda::_1));
>
> ... nor that ...
>
> std::for_each(from.begin(), from.end(), if_then(&boost::lambda::_1 ->*
> &sample::odd, std::cout << boost::lambda::_1));
>
> compiles. VC8++ complains about error C2451: conditional expression of
> type 'boost::lambda::detail::member_pointer_caller<RET,A,B>' is illegal.
> Everything works though with boost::lambda::bind. Why I don't know. From
> the documentation ->* looks like a more readable shortcut than
> boost::lambda::bind. There seem to be some limitations though (or does it
> depend on the compiler)?
>
> Boris
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net