Given a function taking a delegate, for example

```
int fun(int delegate() dg) {return dg();}
```

Sometimes we need to call `fun` with a pointer to a nested function and other times with a pointer to a top level function. As function pointers do not implicitly convert to delegates, this does not work without jumping through hoops.

One option is to define an overload:

```
int fun(int function() fn)
{
    int nested_fn()
    {
        return fn();
    }
    return fun(&nested_fn);
}
```

This is clunky and rather a lot of extra lines to work around a language limitation. The limitation seems somewhat artificial, because a delegate /can/ be initialized referencing a top level function (the spec [1] limits that to delegate declarations at module scope, but this limit does not seem to apply [2]). But you cannot /assign/ it a top level function. You can however explicitly assign the `.funcptr` referencing the top level function, leaving the stack frame pointer null.

Exploiting this, it is possible to explicitly convert a function pointer into a delegate [2]:
```
Ret delegate(Args args) fun_to_dlg(Ret, Args...)(Ret function(Args args) fun)
{
    Ret delegate(Args) dlg;
    dlg.funcptr = fun;
    return dlg;
}
```

allowing
```
int top_level() {return -1;}
void main()
{
    assert(fun(fun_to_dlg(&top_level)) == -1);
}
```

This may be preferable to the overload, depending on the number of calls like this. But since this is allowed and working, why can't it be done automatically? Or, when implicit conversion is dangerous, why doesn't a cast exist to the effect of my template? Have I overlooked an easier way of doing this?

Thanks for any input!
Bastiaan.

P.S. For the record, the spec also says this: "Future directions: Function pointers and delegates may merge into a common syntax and be interchangeable with each other." I wish that was the case already.

[1] Point 9 in https://dlang.org/spec/function.html#closures
[2] https://run.dlang.io/is/x8HJaW

Reply via email to