Domanda

Come posso fare questo? (Il seguente codice non funziona, ma spero che spiega l'idea.)

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

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

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

Voglio chiamare chiamante, in qualche modo, come:

Caller(ToBeCalled, "stuff")

e hanno Caller chiamata ToBeCalled con qualunque parametri si sente esigenze di passaggio. Se possibile voglio tenere tutto incapsulato nella parte privata della mia classe. In realtà, avrei circa 50 funzioni come ToBeCalled, quindi non posso vedere un modo per evitare questo.

Grazie per eventuali suggerimenti. :)

È stato utile?

Soluzione

Sei la maggior parte del tragitto. Ti stai perdendo il tipo restituito dalla typedef, dovrebbe essere

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

Ora, non vi resta che usarlo correttamente:

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

Si vuole passare intorno casi FuncSig semplici, non FuncSig* - un FuncSig* è un puntatore a un puntatore a una funzione membro, con un ulteriore livello di riferimento indiretto inutile. È quindi utilizzare l'operatore freccia stelle (non il suo nome ufficiale) per chiamarlo:

(object_to_be_called_on ->* func)(args);

Per gli oggetti non-puntatore (ad esempio gli oggetti nello stack, o riferimenti a oggetti), si utilizza l'operatore punto stelle:

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

Inoltre, diffidare di precedenza degli operatori - gli operatori freccia stelle e dot-stelle hanno la precedenza inferiore rispetto chiamate di funzione, quindi è necessario mettere tra parentesi extra, come ho fatto in precedenza

.

Altri suggerimenti

Sto assumendo si è tentato già Caller(MyClass::ToBeCalled, "stuff"), ma c'è una ragione particolare è necessario un puntatore a funzione? Inoltre, si prega di inviare l'errore del compilatore vero e proprio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top