delegate vs function
spir
denis.spir at gmail.com
Tue Nov 23 05:42:22 PST 2010
On Tue, 23 Nov 2010 12:25:18 +0000 (UTC)
"Lars T. Kyllingstad" <public at kyllingen.NOSPAMnet> wrote:
> 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.
Great! that is what I have missed.
> > 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);
All right; if I understand, toDelegate cast a pointer to func to a delegate (the pair of pointers)? (Avoiding the error.) I would enjoy this cast to be automatic. So that, if we know original funcs may be of either kind, we can quietly declare the parameter type as delegate.
> (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
-- -- -- -- -- -- --
vit esse estrany ☣
spir.wikidot.com
More information about the Digitalmars-d-learn
mailing list