On 2013-06-10 11:45, Manu wrote:It's not very useful without the context pointer, i.e. "this".
A function pointer is a pointer. A delegate is a pointer to a function
and a context pointer, ie, 2 pointers.
A pointer to a method is just a pointer to a function, but it's a
special function which receives a 'this' argument with a special calling
convention.
It's definitely useful to be able to express a 'thiscall' function pointer.
Also, extern(C++) delegates are useful too in their own right
To do what? As far as I know C++ doesn't have anything corresponding
to a D delegate.
C++ has FastDelegate, which I use to interact with D delegates all the
time! ;)
I didn't know about that. Is that something that is in the language or standard library?
I see.extern(C++) delegate is required to specify the appropriate calling
convention, otherwise it's just a delegate like usual.
Then use a function pointer.
I'm just trying to show that sometimes you don't want a delegate, you
just want a function pointer.
The function pointer of a delegate is typed, it's the context pointer that is void*.delegate's contain the function pointer I'm after, so I can access it
indirectly, but it's just not so useful. It's not typed (is void*), and
you can't call through it.
Sorry, I'm just trying to understand what you're doing, what problems you have. You can compose and decompose delegates using its built-in properties "ptr" and "funcptr".
You can do something like:
class Foo
{
int i;
void a () { writeln("Foo.a i=", i); }
void b () { writeln("Foo.b i=", i); }
}
void main ()
{
auto f1 = new Foo;
f1.i = 3;
auto dg = &f1.a;
dg();
auto f2 = new Foo;
f2.i = 4;
dg.ptr = cast(void*) f2;
dg();
dg.funcptr = &Foo.b;
dg();
}
The only thing that doesn't work with the above is if I change the context pointer to a subclass of Foo which overrides the method I want to call. It will still call the method in Foo unless I change "funcptr".