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

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。如果可能的话我希望把一切都封装在我班上的私有部分。在现实中,我有一个像ToBeCalled约50的功能,所以我看不到的方式来避免这种情况。

感谢您的任何建议。 :)

有帮助吗?

解决方案

您是最那里的方式。你错过了从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);

此外,要警惕运算符优先级 - 箭星和点星运算符比函数调用的优先级低,所以你需要把额外的括号,因为我在上面所做

其他提示

我假设你试过Caller(MyClass::ToBeCalled, "stuff")了,但有没有你需要一个函数指针什么特别的原因?另外,请不要实际编译错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top