delegate vs function
Lars T. Kyllingstad
public at kyllingen.NOSPAMnet
Tue Nov 23 04:25:18 PST 2010
On Tue, 23 Nov 2010 13:15:46 +0100, spir wrote:
> Hello,
>
> alias void function (int) F;
> alias void delegate (int) D;
>
> void fnFunc (F f, int i) {f(i);}
> void dgFunc (D d, int i) {d(i);}
>
> void writeOut (int i) {writeln(i);}
>
> void test () {
> void writeIn (int i) {writeln(i);}
> fnFunc(&writeOut, 1);
> dgFunc(&writeIn, 1);
> //~ fnFunc(&writeIn, 1); // error (expected a func, got a
> delegate...) //~ dgFunc(&writeOut, 1); // error (... and
> conversely) }
>
> If a function is defined at the module's toplevel and then passed (via a
> pointer) to a higher-order func that expects a function, al works fine.
> But if it is defined inside a function, then the pointer is
> automatically typed as delegate, even if the function does not use any
> variable in scope, and I get an error.
Mark the function as 'static', like this:
static void writeIn(int i) { ... }
Then the compiler even ensures that it doesn't use any symbols from the
enclosing scope.
> Conversely, if the higher order
> func is defined to expect a delegate, then it fails if I pass a func
> defined at the top-level. How to solve this?
Use std.functional.toDelegate(), like this:
dgFunc(toDelegate(&writeOut), 1);
(For some reason the documentation for toDelegate() seems to be missing
from the D web site, but I don't know why. I'll look into it.)
-Lars
More information about the Digitalmars-d-learn
mailing list