我怎样才能做到这一点? (以下代码不起作用,但我希望它能解释这个想法。)
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
call ToBeCalled
无论它认为需要传递什么参数。如果可能的话,我想将所有内容都封装在类的私有部分中。实际上,我有大约 50 个函数,例如ToBeCalled
,所以我找不到避免这种情况的方法。
感谢您的任何建议。 :)
你大部分时间都到了那里。您缺少 typedef 的返回类型,它应该是
typedef int (MyClass::*FuncSig)(int, char*);
现在,您只需要正确使用它:
int Caller(FuncSig func, int a, char* some_string)
{
return (this->*func)(a, some_string);
}
你想简单地传递FuncSig
实例,而不是FuncSig*
-- a FuncSig*
是一个指向成员函数的指针,具有额外的不必要的间接级别。然后,您可以使用箭头星号运算符(不是其正式名称)来调用它:
(object_to_be_called_on ->* func)(args);
对于非指针对象(例如堆栈上的对象或对象的引用),您可以使用点星运算符:
MyClass x;
(x .* func)(args);
另外,请注意运算符优先级 - 箭头星形和点星形运算符的优先级低于函数调用,因此您需要像我上面所做的那样放入额外的括号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)