Member function pointers

Prudence via Digitalmars-d digitalmars-d at puremagic.com
Wed Sep 9 11:33:40 PDT 2015


On Tuesday, 27 May 2014 at 12:21:40 UTC, d coder wrote:
> https://github.com/D-Programming-Language/dmd/pull/3181
>
> Daniel asked me to use this. And it works.
>
> Use something like:
>
> union U
> {
>   void delegate(int) dg;
>   struct
>   {
>     void* ptr;
>     void function(int) funcptr;
>   }
> }
> U u;
> u.dg = dg;
> u.funcptr = ...;
> u.ptr = ...;
>
> Regards
> - Puneet

What's the current state of this? I'm in need of such behavior 
for win32 interop.

I'm thinking that one can make the above code more general by 
using it in a mixin and automatically generating the funcptr 
signature:


import std.stdio;
import std.concurrency;

extern (C) int getch();
import std.string;


template FancyDelegate(O, D)
{
	const char[] FancyDelegate = "union "~O.stringof~"Delegate { 
"~D.stringof~" dg; struct { "~O.stringof~"* ptr; 
"~D.stringof.replace("delegate(", 
"function("~O.stringof~",").replace(",)", ")")~" funcptr; } }";	
	//const char[] FancyDelegate = "union "~O.stringof~"Delegate { 
"~D.stringof~" dg; struct { "~O.stringof~"* ptr; 
"~D.stringof.replace("delegate(", "function(")~" funcptr; } }";	
}

class X
{
	public int z = 2;
	public void foo(int x)
	{
		//writeln(this.z*x);
		writeln(x);
	}
}

void delegate(int) dg;

mixin(FancyDelegate!(X, typeof(dg)));


void main()
{

	auto xX = new X();
	XDelegate x;
	x.dg = &xX.foo;
	
	//x.dg(3);
	x.ptr = &xX;
	x.funcptr(xX, 5);
	//x.funcptr(5);

	
	getch();
}

Unfortunately this fails when entering the function. I've tried 
various things(passing &xX, etc..., passing nothing(the comments, 
etc.)

I thought a delegate, when called, was called like a member 
function? It seems that a delegate is some magic black box that 
we can't emulate in any way shape or form due to the calling 
conventions used?


More information about the Digitalmars-d mailing list