3

我怎样才能做到这一点?(以下代码不起作用,但我希望它能解释这个想法。)

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

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

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

我想以某种方式调用 Caller,例如:

Caller(ToBeCalled, "stuff")

并使用它认为需要传递的任何参数进行Caller调用。ToBeCalled如果可能的话,我希望将所有内容都封装在我班级的私有部分中。实际上,我有大约 50 个类似的函数ToBeCalled,所以我看不到避免这种情况的方法。

感谢您的任何建议。:)

4

2 回答 2

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*- aFuncSig*是指向成员函数指针的指针,具有额外的不必要的间接级别。然后,您使用箭头星运算符(不是它的正式名称)来调用它:

(object_to_be_called_on ->* func)(args);

对于非指针对象(例如堆栈上的对象或对对象的引用),您使用点星运算符:

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

另外,请注意运算符的优先级——箭头星号和点星号运算符的优先级低于函数调用,因此您需要像我上面所做的那样放入额外的括号。

于 2009-11-10T04:23:20.343 回答
0

我假设您Caller(MyClass::ToBeCalled, "stuff")已经尝试过,但是您需要函数指针有什么特别的原因吗?另外,请发布实际的编译器错误。

于 2009-11-10T04:23:40.967 回答