Angenommen, ich habe einige Code wie folgt:Ich muss einen einfachen Rückruf in C++ erstellen? Sollte ich die boost :: Funktion benutzen?
class Visitor {
public:
Visitor(callBackFunction) {}
void visit() {
//do something useful
invokeCallback();
}
}
class ClassThatCanBeVisited {
Visitor &visitor;
public:
ClassThatCanBeVisited(Visitor &_visitor) : visitor(_visitor){}
void someUsefulMethod() {
int data= 42;
visitor.visit(data);
}
};
void callBackFunction() {
//do something useful in the context of the Main file
}
int main() {
Visitor visitor;
ClassThatCanBeVisited foo(visitor);
foo.someUsefulMethod();
}
Ich brauche einen einfachen Rückruf zu erstellen, wann immer der Besuch :: Besucher genannt wird() aufgerufen wird. Ich weiß, dass ich den Code des Callbacks wahrscheinlich in meinen Besucher einfügen sollte, aber es ist in einem anderen Kontext, also würde ich die CallBackFunction() an den Besucher weitergeben, damit er meine Callback-Funktion aufrufen konnte.
Ich suchte Sachen auf dem Netz und sah boost :: Funktion, aber C++ hat bereits die grundlegenden functors.
Welches sollte ich für eine bessere Klarheit des Codes verwenden? Der Rückruf wird eine einfache void() Funktion sein, aber es könnte wachsen, man weiß ja nie die Zukunft :)
Was ist der empfohlene Weg, dies zu tun?
Das ist die übliche Art und Weise, wie ich Dinge mache (da ich aus Java komme), aber ich sehe diese Rückrufe nicht als eine gute Sache (zu viele Klassen, jeder sagt boost :: function ist besser, etc.) Also in welcher Weise würde boost :: bind meinen Code lesbarer machen? –
boost :: function befreit Sie davon, von einer Basisklasse zu erben, nur um einen Rückruf zu haben. Es befreit Sie auch davon, durch den Funktionsnamen begrenzt zu werden. Im Wesentlichen kann es verwendet werden, um die Kopplung zu verringern. –
+1 auf den Boost :: Funktionsteil, aber ich mag nicht die var_args Ansatz. Es ist auf verschiedene Arten begrenzt: Sie verlieren Typ Sicherheit, Anrufer und Angerufene müssen sich auf ein Ende der Argumentliste Token und nicht jede Klasse kann durch Ellipse übergeben werden (nur PODs, wenn ich mich richtig erinnere) –