This isn't code to be used for anything (just understanding).
```d
import std;

struct Delegate(A,B) {
    B function(void* ptr, A a) f;
    void* data;
    B opCall(A a) {
        return f(data,a);
    }
}

auto toDelegate(A, B,S)(S s) {
    static B f(void* ptr, A a) {
        return (*(cast(S*) ptr))(a);
    }
    Delegate!(A,B) ret;
    ret.f=&f;
    ret.data= cast(void*) &s;
    return ret;
}

struct Adder {
    int a;
    int opCall(int b) { return a+b; }
}
auto adder(int a) {
    auto ret = Adder.init;
    ret.a=a;
    return ret;
}

void main() {
    auto g = adder(5);
    g(5).writeln;
    auto d = toDelegate!(int, int)(g);
    d(5).writeln;
    auto a =7;
    auto h = (int b)=>a+b;
    auto d1 = toDelegate!(int,int)(h);
    void* ptr = cast(void*) &h;
    (*cast(int delegate(int)*) ptr)(10).writeln;
    d1(10).writeln;
    h(10).writeln;
}
```

Reply via email to