D equivalent of C++ bind ?

chmike via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon May 16 08:11:26 PDT 2016


On Thursday, 12 May 2016 at 10:38:37 UTC, Dsby wrote:

> I write one, bind functon to a delegate.
>
> In here:
> https://github.com/putao-dev/collie/blob/master/source/collie/utils/functional.d
>
>
> this is the code:
>
> auto  bind(T,Args...)(auto ref T fun,Args args) if 
> (isCallable!(T))
> {
>     alias FUNTYPE = Parameters!(fun);
>     static if(is(Args == void))
>     {
>         static if(isDelegate!T)
>             return fun;
>         else
>             return toDelegate(fun);
>     }
>     else static if(FUNTYPE.length > args.length)
>     {
>         alias DTYPE = FUNTYPE[args.length..$];
>         return
>             delegate(DTYPE ars){
>                 TypeTuple!(FUNTYPE) value;
>                 value[0..args.length] = args[];
>                 value[args.length..$] = ars[];
>                 return fun(value);
>             };
>     }
>     else
>     {
>         return delegate(){return fun(args);};
>     }
> }

Thank you. Would you agree to help me understand it ?

The only thing I don't understand is why the function template 
argument is defined as T and the argument as auto ref T fun. Why 
the auto ref  and not alias T in the template argument list ?

This bind is better than Partial!() from std.functional since it 
accepts any number of parameters. But the given parameters are 
passed as first arguments of fun. The std::bind of C++ allows to 
bind any parameter in any order and eventually multiple times. 
It's really as if a new function was defined with a total liberty 
degree on its signature.

Anyway thank you very much.


More information about the Digitalmars-d-learn mailing list