Function pointer to member function.
TheFlyingFiddle
theflyingfiddle at gmail.com
Thu Oct 17 14:27:36 PDT 2013
On Thursday, 17 October 2013 at 03:21:38 UTC, Chris Cain wrote:
> On Thursday, 17 October 2013 at 01:17:21 UTC, TheFlyingFiddle
> wrote:
>> I would like to get access to a member function pointer. Taking
>> the this* as
>> the first argument.
>>
>> ...snip...
>> How should i implement getFP above? Is it even possible?
>
> Well, it's certainly possible. If you were to do this:
> ```
> delegate void(int) dg = &a.bar;
> dg(1);
> ```
> then you'd see the behavior you're looking for. Basically the
> class reference is stored in dg.ptr and the function is in
> dg.funcptr.
>
> With that in mind, I whipped this up:
> ```
> import std.stdio;
>
> class Foo {
> char c;
> this() {
> c = 'a';
> }
> this(char _c) {
> c = _c;
> }
> void bar(int i) {
> writeln("i = ", i, " c = ", c);
> }
> }
>
> import std.traits;
> //ParentOf!S is pseudocode representing __traits(parent, S)
> //ReturnType!S function(ParentOf!S, ParameterTypeTuple!S)
> auto getFP(alias S)() if(isSomeFunction!S) {
> mixin("alias Parent = " ~ __traits(parent, S).stringof ~
> ";");
> return (Parent r, ParameterTypeTuple!S t) {
> ReturnType!S delegate(ParameterTypeTuple!S) dg;
> dg.funcptr = &S;
> dg.ptr = cast(void*) r;
> return dg(t);
> };
> }
>
> void main() {
> Foo a = new Foo();
> Foo b = new Foo('b');
>
> auto fp = getFP!(Foo.bar);
> fp(a, 1);
> fp(b, 2);
> }
> ```
>
> Now one thing to note is that I'm not confident it's bug-free.
> It does work in this test case, but I couldn't use
> __traits(parent, S) as a type, so I used a mixin to kind of
> force it to work. So I'm not fully sure whether it will work in
> all cases, but if someone else has some improvements, that's
> fine.
>
> Another thing: I didn't spend too much time on the template
> constraint. "isSomeFunction" is almost certainly too
> permissive. I just threw it together and I haven't coded in D
> for a while.
>
> I hope this helped!
Thanks, this works well for my needs.
More information about the Digitalmars-d-learn
mailing list