我知道成员函数指针有点棘手,如果函数指针不是类本身的成员,我可以调用它,但如果它是类的成员,似乎无法做到:
struct Window
{
virtual void handleEvent() {};
void (Window::*pHandleEvent)();
};
int main()
{
Window w;
void (Window::*fnptr)() = &Window::handleEvent;
(w.*fnptr)(); // Works fine calling a local func ptr
w.pHandleEvent(); // Calling its own member pointer doesn't work
// Err: Expression preceding parentheses of apparent call must have
// (pointer-to) function type
(w.*pHandleEvent)(); // Doesn't work
//Err: identifier "pHandleEvent" is undefined
(w.*Window::pHandleEvent)(); // Doesn't work.
// Err: A non-static member reference must be relative to a specific object.
}
答案 0 :(得分:4)
您需要指定两个Window
对象:使用其指针的对象和调用该方法的对象。如果它们是相同的,那就是
(w.*w.pHandleEvent)();
请注意优先顺序:如果您改为A Window::*ptm;
并希望成为A
对象的成员,则为(w.*ptm).a_member
。
答案 1 :(得分:1)
使用C ++ 17,您可以依靠std::invoke
获取指向成员需求的所有指针:
std::invoke(w.pHandleEvent, w);
第一个参数是指向成员的指针,第二个参数是对象或指向它的指针。所有的语法业务都会为你照顾。