Given the following program:

struct PingQuery {
        string msg;
}
struct PingResponse {
        string msg;
}
template send(T) {
        void send(T query, void delegate(PingResponse) callback) {
                writefln("Sending: %s", query);
                if (callback) {
                        PingResponse resp;
                        resp.msg = query.msg;
                        callback(resp);
                }
        }
}
void main() {
        send(PingQuery("helo"), (resp) {
                writefln("Got response: %s", resp);
        });
}

This works, but as you can see the PingResponse struct is hardcoded in the send function. If I try to make it a part of the template in a way such as this:

struct PingQuery {
        alias RESPONSE = PingResponse;
        string msg;
}
struct PingResponse {
        string msg;
}
template send(T) {
static assert(is(T.RESPONSE == PingQuery.RESPONSE)); // this succeeds at least

        void send(T query, void delegate(T.RESPONSE) callback) {
                writefln("Sending: %s", query);
                if (callback) {
                        T.RESPONSE resp;
                        resp.msg = query.msg;
                        callback(resp);
                }
        }
}
void main() {
        send(PingQuery("helo"), (resp) {
                writefln("Got response: %s", resp);
        });
}
I get:
delegatetest.d(48): Error: template `delegatetest.send` cannot deduce function from argument types `!()(PingQuery, void)`, candidates are: delegatetest.d(35): `send(T)(T query, void delegate(T.RESPONSE) callback)`

Same error if I use a nested struct (e.g. struct PingQuery { struct RESPONSE {} }) instead of an alias. Currently using DMD32 D Compiler v2.095.0-dirty (win64).


Reply via email to