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) (...)’
¿Fue útil?

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í:

http://ideone.com/p3a5g

La sintaxis es bastante antinatural pero una consecuencia de las reglas de precedencia de C ++ ...

(obj.*obj.pf)(1, 2);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top