On Tuesday, 10 May 2016 at 09:39:53 UTC, chmike wrote:
Is there an equivalent in D of the C++11 std.bind template class [http://en.cppreference.com/w/cpp/utility/functional/bind] ?

Here is a blog post showing different examples of its use
https://oopscenities.net/2012/02/24/c11-stdfunction-and-stdbind/


A possible use case is for a callback function/delegate with the expected signature bool cb(int error). I would like to pass a function bool myCb(int error, ref int myArg) instead with the variable myArg being given as predefined argument.

Here is an example.
----
int count = 0;

bool myCb(int error, ref int myArg)
{
    if (myArg >= 6)
        return false;
    writeln(++myArg);
    return true;
}

void async_task(void function(int error) cb) { . . . while cb(0) . . . }

void main() {
    . . .
    async_task( ??? myCb ??? count ??? );
    . . .
}
----

In C++ we would write

async_task(std::bind(myCb, std::placeholders::_1, count));

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);};
    }
}

Reply via email to