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

StackOverflow https://stackoverflow.com/questions/6316751

Вопрос

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) (...)’
Это было полезно?

Решение

Как это:

(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

Другие советы

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

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

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

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

http://ideone.com/p3a5g

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

(obj.*obj.pf)(1, 2);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top