Pointers to non-static member functions!
Steven Schveighoffer
schveiguy at yahoo.com
Wed Jun 8 07:54:54 PDT 2011
On Wed, 08 Jun 2011 10:40:48 -0400, Daniel Murphy
<yebblies at nospamgmail.com> wrote:
> "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
> }
Yes, but removing type safety does not prevent that from happening, plus
it allows something like this:
class A
{
void func();
int func2();
}
void main()
{
auto a = new A;
auto dg = &a.func2();
dg.funcptr = &A.func; // works if dg.funcptr and &A.func are void*, but
doesn't work today
int x = dg(); // runs and returns garbage
}
I almost would prefer that hacking delegates would be illegal. Yes, you
can get the function pointer and data pointer out of a delegate, but
cannot set them. I can't think of any good use cases for them.
I'm mixed on whether you should be able to get a member "function
pointer". It would be nice to simply make it a normal function pointer
that you can call with the appropriate type.
BTW, if the calling convention is different, we may be able to allow it
via creating a "this" function pointer:
assert(is(typeof(&A.func2) == int function(A this)));
Since this is a keyword, it can be interpreted as a different calling
convention.
-Steve
More information about the Digitalmars-d
mailing list