Как вызвать указатель на функцию-член, когда он является членом класса?

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 ?
}

В приведенном выше тестовом коде pf является членом данных B. Какое правило грамматики нужно вызывать? Это должно быть прямо, но я не получаю надлежащего соответствия. например Если я попробую obj.*pf(0,0);, я получаю:

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

Ответ 1

Вот так:

(obj.*obj.pf)(0, 1);

Доступ пользователя (.) имеет более высокий приоритет, чем указатель на оператор-член, поэтому это эквивалентно:

(obj.*(obj.pf))(0, 1);

Поскольку вызов функции также имеет более высокий приоритет, чем указатель на оператор-член, вы не можете делать:

obj.*obj.pf(0, 1) /* or */ obj.*(obj.pf)(0, 1)

Как это было бы эквивалентно:

obj.*(obj.pf(0, 1)) // grammar expects obj.pf to be a callable returning a
                    // pointer to member

Ответ 2

pf является указателем метода, и вы хотите вызвать метод, на который он указывает, поэтому вы должны использовать

(obj.*obj.pf)(1, 2);

Он говорит, что объект obj вы вызываете метод, обозначенный pf

См. результат здесь:

http://ideone.com/p3a5G

Ответ 3

Синтаксис довольно неестественен, но является следствием правил приоритета С++...

(obj.*obj.pf)(1, 2);