Pregunta

¿Cómo puedo hacer esto? (El código siguiente no funciona, pero espero que explica la idea.)

class MyClass  
{  
    ....  
 private:
    int ToBeCalled(int a, char* b);

    typedef (MyClass::*FuncSig)(int a, char* b);

    int Caller(FuncSig *func, char* some_string);
}

Quiero llamar de llamadas de cierta manera como:

Caller(ToBeCalled, "stuff")

y tienen Caller llamada ToBeCalled con lo que los parámetros que se siente necesidades que pasa. Si es posible quiero mantener todo encapsulado en la parte privada de mi clase. En realidad, tendría unos 50 funciona como ToBeCalled, así que no puedo ver una manera de evitar esto.

Gracias por cualquier sugerencia. :)

¿Fue útil?

Solución

Usted es la mayor parte del camino. Que se está perdiendo el tipo de retorno de la typedef, debería ser

typedef int (MyClass::*FuncSig)(int, char*);

Ahora, sólo tiene que utilizar correctamente:

int Caller(FuncSig func, int a, char* some_string)
{
    return (this->*func)(a, some_string);
}

¿Quieres pasar alrededor de los casos FuncSig de fricción, no FuncSig* - un FuncSig* es un puntero a un puntero a una función miembro, con un nivel innecesario extra de indirección. A continuación, utiliza el operador flecha estrellas (no su nombre oficial) para llamar a él:

(object_to_be_called_on ->* func)(args);

Para objetos que no son de puntero (por ejemplo, objetos en la pila, o referencias a objetos), se utiliza el operador punto estrellas:

MyClass x;
(x .* func)(args);

También, tener cuidado de precedencia de los operadores - los operadores flecha-estrella y punto-estrella tienen menor prioridad que las llamadas de función, por lo que necesita para poner en los paréntesis adicionales como lo he hecho anteriormente

.

Otros consejos

Estoy asumiendo que ha intentado Caller(MyClass::ToBeCalled, "stuff") ya, pero ¿hay alguna razón en particular que necesita un puntero de función? También, por favor, puesto que el error del compilador real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top