
On Tue, 13 Mar 2007 00:21:36 +0200, Rodolfo Lima <rodolfo@rodsoft.org> 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