Method pointers are *function* pointers?? Or delegates??

Steven Schveighoffer schveiguy at yahoo.com
Fri May 18 11:59:23 PDT 2012


On Fri, 18 May 2012 14:30:46 -0400, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> On 5/18/12 1:22 PM, Mehrdad wrote:
>> My brain just exploded.
>> Can someone explain what's going on?
>>
>> class Test
>> {
>> public void foo() { }
>> }
>>
>> static assert(is(typeof(&Test.foo) == void function()));
>
> Looks like a bug. The assert should pass only if foo were static.

No, this is not a bug.

The purpose is so you can get the function pointer portion of a delegate  
without an instance of the object.

Possible (obscure) usage:

class Test
{
   public void foo() { writeln("foo");}
   public void bar() { writeln("bar");}
}

void x(Object context, void function() f1, void function() f2)
{
    void delegate() dg;
    dg.ptr = cast(void *)context;
    if(uniform(0, 2))
       dg.funcptr = f1;
    else
       dg.funcptr = f2;
    dg();
}

void main()
{
   auto t = new Test;
   x(t, &Test.foo, &Test.bar);
}

Another interesting usage is to test if a function has been overridden:

if((&t.foo).funcptr == &Test.foo)
    writeln("not overridden!");

I personally think the "feature" is too awkward for any real usage.   
Someone once suggested funcptr and &Test.foo should return void *, so the  
addresses could be compared, but not used (it's too easy to call this  
function).

In any case, not a bug.

-Steve


More information about the Digitalmars-d mailing list