嗯,正如我在问题中所说的:指向成员方法的指针
我的问题: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;
}
};
现在我想从类外部调用公共Run
ptr。说:
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);
(参见示例)