On Monday, 22 May 2017 at 20:38:27 UTC, Dukc wrote:
On Monday, 22 May 2017 at 09:04:15 UTC, Alex wrote:
2. Now, I want to store the delegate in another struct. If I want to do this, I have to define the pointer as static. This is not intended at the beginning, but it's ok, as I know, that the delegate would be the same across all instances of B.

The reason it does not work with a non-static member is that A generated has no way of knowing where B that contains the delegate to be called resides. But it works when done this way:

struct A(alias dg)
{
    auto fun(T...)(T params)
    {
        return dg(params);
    }
}

struct B
{
    A!((B b, int i, string a) => b.dlgptr(i, a)) a;
    void delegate(int, string) dlgptr;
    this(void delegate(int, string) dlg)
    {
        dlgptr = dlg;
    }
    void fun(int i, string s)
    {
        a.fun(this, i, s);
    }
}

void main()
{
    auto dlg(int i, string s)
    {
        import std.stdio;
        writeln(i, " ", s);
    }
    auto b = B(&dlg);
    b.fun(5, "a");
}

I wasn't in mood to look at C though, so I don't know if this helps.

Yes, it does :)
The step to the C variant is, how to rewrite the lines

A!((B b, int i, string a) => b.dlgptr(i, a)) a;
and
this(void delegate(int, string) dlg)

if I want to define my delegate as a template:

template dlgptr(T, U...)
{
    void delegate(T, U) dlgptr;
}

Reply via email to