我该怎么做? (以下代码不起作用,但我希望它能解释这个想法。)
class MyClass
{
....
private:
int ToBeCalled(int a, char* b);
typedef (MyClass::*FuncSig)(int a, char* b);
int Caller(FuncSig *func, char* some_string);
}
我想以某种方式呼叫来电者:
Caller(ToBeCalled, "stuff")
并Caller
调用ToBeCalled
,无论其感觉需要传递什么参数。如果可能的话,我想保留封装在我班级私人部分的所有内容。实际上,我有大约50个函数,比如ToBeCalled
,所以我看不到避免这种情况的方法。
感谢您的任何建议。 :)
答案 0 :(得分:7)
你大部分都在那里。你错过了typedef的返回类型,它应该是
typedef int (MyClass::*FuncSig)(int, char*);
现在,您只需要正确使用它:
int Caller(FuncSig func, int a, char* some_string)
{
return (this->*func)(a, some_string);
}
您希望传递普通FuncSig
实例,而不是FuncSig*
- FuncSig*
是指向成员函数指针的指针,具有额外不必要的间接级别。然后使用箭头星运算符(而不是其正式名称)来调用它:
(object_to_be_called_on ->* func)(args);
对于非指针对象(例如堆栈中的对象或对象的引用),使用点星运算符:
MyClass x;
(x .* func)(args);
另外,要警惕运算符优先级 - 箭头星和点星运算符的优先级低于函数调用,所以你需要像上面那样加入额外的括号。
答案 1 :(得分:0)
我假设您已经尝试过Caller(MyClass::ToBeCalled, "stuff")
,但是有什么特别的原因需要函数指针吗?另外,请发布实际的编译器错误。