
On Wed, Aug 24, 2011 at 5:13 PM, Eric Niebler <eric@boostpro.com> wrote:
On 8/24/2011 1:58 AM, Roman Perepelitsa wrote:
2011/8/23 Eric Niebler <eric@boostpro.com> <snip> By the way, don't you need to manually pass arity in the general case? What if the underlying functor is callable with one argument, but also with two?
As soon as enough arguments are collected to make a valid call of the curried function, it gets called. This seems reasonable to me.
I think this is the case with functors generated by bind -- they appear to be callable with any number of arguments.
Ouch. :-(
Exactly. They need to be called with N number of arguments where N is larger than highest arity of the placeholders used (_1 has arity 1, _2 has 2 and so on ...). This is needed to allow to omit some of the passed parameters. For example asio callbacks were you might not be interested in the number of bytes written.
One option, which I don't like, is to "fix" bind to disable any operator() overloads that result in an invalid invocation of the bound function. That can be done easily with the is_callable_with metafunction in my curryable implementation, but would reduce portability somewhat.
We can certainly disable certain operator() overloads for phoenix actors. this is on my TODO for a very long time now ... Its actually quite simple. just introspect the current expression and look for placeholders. Reusing your is_callable_with metafunction would be cool to disable the bind functions for functors.
FWIW, Egg<http://p-stade.sourceforge.net/egg/doc/html/egg/function_adaptors.html>has curryN (where N is a number literal) and uncurry.
Of course, I'd prefer it if it just worked without needing to be told the arity. That's what I was aiming for.
I would like to pursue a general curry approach which just calls the function whenever it could be called, and the curryN approache to tell exactly which overload i woul dlike to have.