¿Cómo invocar el puntero a la función miembro cuando es un miembro de datos de clase?
-
26-10-2019 - |
Pregunta
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 ?
}
En el código de prueba anterior, pf
es un miembro de datos de B
. ¿Cuál es la regla de la gramática para invocarla? Debería ser sencillo, pero no estoy obteniendo una coincidencia adecuada. por ejemplo, si lo intento obj.*pf(0,0);
Entonces entiendo:
error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pf (...)’, e.g. ‘(... ->* pf) (...)’
Solución
Como esto:
(obj.*obj.pf)(0, 1);
Acceso de miembro (.
) tiene una precedencia más alta que un puntero al operador miembro, por lo que esto es equivalente a:
(obj.*(obj.pf))(0, 1);
Debido a que la llamada de función también tiene mayor precedencia que un puntero al operador miembro, no puede hacer:
obj.*obj.pf(0, 1) /* or */ obj.*(obj.pf)(0, 1)
Como eso sería equivalente a:
obj.*(obj.pf(0, 1)) // grammar expects obj.pf to be a callable returning a
// pointer to member
Otros consejos
PF es un puntero de método, y desea invocar el método al que señala, por lo que debe usar
(obj.*obj.pf)(1, 2);
Dice el objeto obj que invoca el método señalado por PF
Ver resultado aquí:
La sintaxis es bastante antinatural pero una consecuencia de las reglas de precedencia de C ++ ...
(obj.*obj.pf)(1, 2);