Private member function that takes a pointer to a private member in the same class
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. :)
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.
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.
精彩评论