If I want to have a method taking a callback function, I have to specify if it should take a function or delegate even if I don't really care. What's the best way to accept either? I cannot see any wrapper for something like this in std.typecons.

import std.stdio, std.traits;

void f(int i, void function(int) fn) {
    fn(i);
}

void d(int i, void delegate(int) dg) {
    dg(i);
}

// ugly..
void g(F)(int i, F callback) {
    static assert(isSomeFunction!F, "callback is not a function");
static assert(__traits(compiles, { callback(i); }), "callback does not take int as a parameter");
    callback(i);
}

void fcb(int i) {
    writeln(i);
}

void main() {

// Error: function t.f (int i, void function(int) fn) is not callable using argument types (int,void delegate(int))
    // f(1, (int i) { writeln(i); });
    f(2, &fcb);
    d(3, (int i) { writeln(i); });
//Error: function t.d (int i, void delegate(int) dg) is not callable using argument types (int,void function(int))
    //d(4, &fcb);
    g(5, &fcb);
    g(6, (int i) { writeln(i); });
    //g(7, 7); // not a function
    //g(8, (string s) { }); // does not take int as arg
}

Reply via email to