Issue with typeof

Moritz Maxeiner via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Mar 20 11:27:39 PDT 2017


On Monday, 20 March 2017 at 17:58:32 UTC, Moritz Maxeiner wrote:

> 2) Create a template that can be used like this (you'll want to 
> consult std.traits for this):
>
> void foo (delegateOf!(T.method) fptr) {}

This may sound harder that it is, btw. A template that does 
exactly that is the following (template constraints that verify 
`method` to actually be a member method left out):

template DelegateTypeOf(alias method)
{
     import std.array : replaceFirst;
     import std.string : format;

     enum fnType = typeof(&method).stringof;
     enum dgType = fnType.replaceFirst("function", "delegate");

     mixin(`alias DelegateTypeOf = %s;`.format(dgType));
}

Including the above, a full example would be the following:

interface T
{
     void method(int x);
}

void foo(DelegateTypeOf!(T.method) dg)
{
     dg(42);
}

class X : T
{
     void method(int x)
     {
         import std.stdio : writefln;
         writefln("Hello, world #%d!", x);
     }
}

void main()
{
     T t = new X;
     foo(&t.method);
}


More information about the Digitalmars-d-learn mailing list