Taking a function or delegate as argument.

simendsjo simendsjo at gmail.com
Tue Jan 10 05:05:23 PST 2012

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) {

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

// 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");

void fcb(int 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

More information about the Digitalmars-d-learn mailing list