Function pointer pitfalls

H. S. Teoh via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Mar 14 12:14:34 PDT 2017


On Tue, Mar 14, 2017 at 06:59:58PM +0000, Inquie via Digitalmars-d-learn wrote:
> On Tuesday, 14 March 2017 at 17:42:34 UTC, H. S. Teoh wrote:
[...]
> > 	struct X {
> > 		int method(float x) { return 0; }
> > 	}
> > 
> > 	typeof(&X.method) membptr;
> > 	pragma(msg, typeof(membptr)); // prints `int function(float x)`
> > 
> > If you need to refer to the function pointer type frequently, you
> > could alias it to something easier to type;
> > 
> > 	alias FuncPtr = typeof(&X.method);
> > 	FuncPtr membptr;
[...]
> Thanks, that will work. In C++ there were issues with pointers and one
> would have to properly group the function name or some thing like
> that. Your suggestion avoids all that.
[...]

Keep in mind, though, that the above creates a function pointer with the
same signature as the member function, but you may not be able to assign
a member pointer to it because it lacks object context.  To wit:

----
	struct X {
		int method(float x) { return 0; }
	}

	X x;

	alias FuncPtr = typeof(&X.method);
	FuncPtr fp;

	alias MembPtr = typeof(&x.method);
	MembPtr mp;

	mp = &x.method;	// OK
	//fp = &x.method; // NG: cannot implicitly convert expression (&x.method) of type int delegate(float z) to int function(float z)
-----

&x.method is a delegate because it encapsulates the instance of X that
it should be invoked with, so you can't assign it to a func ptr without
that context (since method() can't be called without an instance of X).


T

-- 
Question authority. Don't ask why, just do it.


More information about the Digitalmars-d-learn mailing list