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