Как вызвать указатель на функцию-член, когда это член класса данных? - PullRequest
11 голосов
/ 11 июня 2011
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) (...)’

Ответы [ 3 ]

14 голосов
/ 11 июня 2011

Как это:

(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
5 голосов
/ 11 июня 2011

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

(obj.*obj.pf)(1, 2);
5 голосов
/ 11 июня 2011

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

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

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

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

http://ideone.com/p3a5G

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...