如何在成为类数据成员时调用指向成员函数的指针?

iam*_*ind 11 c++ member-function-pointers member-variables

struct B
{
  void (B::*pf)(int, int);  // data member
  B () : pf(&B::foo) {}
  void foo (int i, int j) { cout<<"foo(int, int)\n"; } // target method
};

int main ()
{
  B obj;
  // how to call foo() using obj.pf ?
}
Run Code Online (Sandbox Code Playgroud)

在上面的测试代码中,pf是一个数据成员B.调用它的语法规则是什么?它应该是直截了当的,但我没有得到正确的匹配.例如,如果我尝试,obj.*pf(0,0);那么我得到:

error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pf (...)’, e.g. ‘(... ->* pf) (...)’
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 14

像这样:

(obj.*obj.pf)(0, 1);
Run Code Online (Sandbox Code Playgroud)

成员access(.)的优先级高于指向成员运算符的指针,因此这相当于:

(obj.*(obj.pf))(0, 1);
Run Code Online (Sandbox Code Playgroud)

因为函数调用的优先级高于指向成员运算符的指针,所以不能这样做:

obj.*obj.pf(0, 1) /* or */ obj.*(obj.pf)(0, 1)
Run Code Online (Sandbox Code Playgroud)

因为这相当于:

obj.*(obj.pf(0, 1)) // grammar expects obj.pf to be a callable returning a
                    // pointer to member
Run Code Online (Sandbox Code Playgroud)


Geo*_*roy 5

pf是一个方法指针,你想调用它指向的方法,所以你必须使用

(obj.*obj.pf)(1, 2);
Run Code Online (Sandbox Code Playgroud)

它说对象obj你调用pf指向的方法

在此处查看结果:

http://ideone.com/p3a5G


650*_*502 5

语法非常不自然,但是C++优先级规则的结果......

(obj.*obj.pf)(1, 2);
Run Code Online (Sandbox Code Playgroud)