Frage

Wie kann ich das tun? (Der folgende Code nicht funktioniert, aber ich hoffe, dass es die Idee erklärt.)

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

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

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

Ich möchte Anrufer in irgendeiner Weise nennen wie:

Caller(ToBeCalled, "stuff")

und haben Caller Anruf ToBeCalled mit dem, was es fühlt sich Parameter vorbei Bedürfnisse. Wenn möglich möchte ich alles im privaten Teil meiner Klasse gekapselt halten. In Wirklichkeit würde ich über 50 Funktionen wie ToBeCalled habe, so kann ich nicht einen Weg, dies zu vermeiden sehen.

Vielen Dank für alle Vorschläge. :)

War es hilfreich?

Lösung

Sie sind die meisten der Weg dorthin. Sie sind den Rückgabetyp aus dem typedef fehlt, sollte es sein

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

Nun müssen Sie nur um es richtig verwenden:

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

Sie wollen um Ebene FuncSig Instanzen passieren, nicht FuncSig* - ein FuncSig* ein Zeiger auf einen Zeiger auf eine Elementfunktion ist, mit einer zusätzlichen unnötigen Zwischenstufe. Dann verwenden Sie den Pfeil-Sterne-Operator (nicht der offizielle Name) zu nennen:

(object_to_be_called_on ->* func)(args);

Für Nicht-Zeiger-Objekte (zum Beispiel Objekte auf dem Stapel, oder Verweise auf Objekte), verwenden Sie den Punkt-Sternoperator:

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

Auch sein, den Operator Vorrang vorsichtig - die Pfeil-Sterne und Punkt-Sterne-Betreiber haben niedrigere Priorität als Funktionsaufrufe, so müssen Sie in den zusätzlichen Klammern setzen, wie ich oben getan habe

.

Andere Tipps

Ich nehme an, Sie versucht Caller(MyClass::ToBeCalled, "stuff") schon, aber gibt es einen besonderen Grund Sie einen Funktionszeiger benötigen? Außerdem geben bitte die aktuellen Compiler-Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top