Pointers to non-static member functions!

Daniel Murphy yebblies at nospamgmail.com
Wed Jun 8 07:40:48 PDT 2011


"Steven Schveighoffer" <schveiguy at yahoo.com> wrote in message 
news:op.vwrgycgjeav7ka at localhost.localdomain...
>
> The reason is to allow composition of delegates (not that I think this is 
> a worthy reason):
>
> class A
> {
>    void func();
>    void func2();
> }
>
> void main()
> {
>    auto f = &A.func2;
>    auto a = new A();
>    auto g = &a.func; // delegate
>    g.funcptr = f;
>    g(); // calls a.func2()
> }
>
> I'd argue that a much more useful return type would be a delegate with the 
> this pointer set to null, but then I don't know what funcptr would 
> return.  I almost think you need a separate type for it, which seems like 
> a lot of effort for something that's hardly used.
>
> -Steve

I can see this being useful, but I think it should be done by having 
delegate.funcptr be a void* and &ClassType.nonstaticmemberfunction return 
void*.
The type safety provided by the current way it works is an illusion, as the 
following compiles:

class A
{
  void func() { do something using member variables or the vtable etc }
}
class B
{
  void func() {}
}
void main()
{
  auto b = new B();
  auto dg = &b.func;
  dg.funcptr = &A.func;
  dg(); // Probably a segfault
} 




More information about the Digitalmars-d mailing list