Как вызвать указатель на функцию члена, когда это член данных класса?
-
26-10-2019 - |
Вопрос
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
См. Результат здесь:
Синтаксис довольно неестественный, но следствие правил приоритета C ++ ...
(obj.*obj.pf)(1, 2);