
Peter Dimov wrote:
Daniel Walker wrote:
[...]
_1 == _2 // ambiguous lambda::hold(_1) == _2 // lambda expression lambda::release(_1) == _2 // 3rd-party expression
I think that the right thing here (if we take the interoperability issue to heart) is to make
_1 == _2
"just work". It's an interesting challenge, but it's not impossible since that is exactly what is_bind_expression is intended to solve.
The next milestone, boost::bind( f, _1 + _2 ), is harder since it requires boost::bind to respect specializations of is_bind_expression.
Although I don't know all the details of bind and lambda, I had hoped that _1 and _2 would be abstract proto entities, such that _1 == _2 creates an expression template like: equal< terminal< arg<1> >, terminal< arg<2> > > which is a generic, abstract representation of an equals expression with two placeholders. Can't bind and lambda both be implemented to recognize such a type and do the appropriate thing with it? The only minor complication is that for the placeholders and expressions containing them, operator() must evaluate the expression rather than create a larger expression template. But that's trivial to do with proto. -- Eric Niebler Boost Consulting www.boost-consulting.com