指向方法的指针问题



嗯,正如我在问题中所说的:指向成员方法的指针

我的问题:msvc++抛出错误。

如果我们有:

class A 
{
bool one, two;
typedef void (A::* RunPtr)(int);
public:
RunPtr Run;
A() : one(false), two(false)
{
Run = &A::RunOff;
}
void SetOne(bool value)
{
one = value;
}
void SetTwo(bool value)
{
two = value;
}
void SetOnOrOff()
{
if (one || two)
Run = &A::RunOn;
else
Run = &A::RunOff;
}
void RunOn(int param)
{
//RunOn stuff here
cout << "RunOn: " << param << endl;
}
void RunOff(int param)
{
//RunOff stuff here
cout << "RunOff: " << param << endl;
}
};

现在我想从类外部调用公共Runptr。说:

A a = new A();
a->*Run(10);    // notice that 10 is an int

我试过两种方法:

a->Run(10)      // Option 1
a->*Run(10)     // Option 2

选项1把我

term does not evaluate to a function taking 1 arguments

选项2把我

function does not take 1 argument

这两个错误不允许我调用方法指针。

使用argument调用成员Run(保存指向成员函数的指针)的正确语法是

A* a = new A();
(a->*(a->Run))(10);
^^^ ---------> argument(s)
^^^^^^^^^ -------------> class member "Run"
^^^^^^^^^^^^^^--------------> call to member function pointer syntax
// delete a after use

注意a是指向A类的指针。你需要首先解引用指针来访问它的成员(即a->Run)。现在您需要调用指向成员函数指针的指针语法,并再次取消对指针a的引用。

然而,使用std::invoke调用会容易得多(从c++17开始)。

#include <functional>   // std::invoke
std::invoke(a->Run, a, 10);

(参见示例)

最新更新