Question

How can I do this? (The following code does NOT work, but I hope it explains the idea.)

class MyClass  
{  
    ....  
 private:
    int ToBeCalled(int a, char* b);

    typedef (MyClass::*FuncSig)(int a, char* b);

    int Caller(FuncSig *func, char* some_string);
}

I want to call Caller in some way like:

Caller(ToBeCalled, "stuff")

and have Caller call ToBeCalled with whatever parameters it feels needs passing. If at all possible I want to keep everything encapsulated in the private part of my class. In reality, I'd have about 50 functions like ToBeCalled, so I can't see a way to avoid this.

Thanks for any suggestions. :)

Was it helpful?

Solution

You're most of the way there. You're missing the return type from the typedef, it should be

typedef int (MyClass::*FuncSig)(int, char*);

Now, you just need to use it properly:

int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}

You want to pass around plain FuncSig instances, not FuncSig* -- a FuncSig* is a pointer to a pointer to a member function, with an extra unnecessary level of indirection. You then use the arrow-star operator (not its official name) to call it:

(object_to_be_called_on ->* func)(args);

For non-pointer objects (e.g. objects on the stack, or references to objects), you use the dot-star operator:

MyClass x;
(x .* func)(args);

Also, be wary of operator precedence -- the arrow-star and dot-star operators have lower precedence than function calls, so you need to put in the extra parentheses as I have done above.

OTHER TIPS

I'm assuming you tried Caller(MyClass::ToBeCalled, "stuff") already, but is there any particular reason you need a function pointer? Also, please post the actual compiler error.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top