Sie können operator(), auch bekannt als Funktionsaufrufoperator, verwenden, um ein Objekt wie eine Funktion zu behandeln (und als solche zu verwenden).
Diese Objekte werden oft als "Funktoren" bezeichnet, aber das sollte nicht mit dem gleichen Begriff aus der Mathematik verwechselt werden. Ich glaube, der korrektere Begriff ist "Funktionsobjekt".
Stellen Sie sich vor, Sie haben eine Funktion, die einen Rückruf annimmt. Aber nehmen Sie an, Sie müssen einen Zustand in diesem Rückruf speichern.
(Anmerkung: Ich habe diesen Code nicht kompiliert, aber Sie verstehen die Idee)
void DoStuffAndCallBack(MyCallbackType Callback)
{
...
Callback(args)
...
}
In C oder in C++ mit Klassen würden Sie dieser Methode eine statische Callback-Funktion übergeben und die Ergebnisse in einer globalen oder klassenstatischen Variablen speichern.
Aber in C++ könnte die Funktion so geschrieben werden:
template<CallbackType>
void DoStuffAndCallBack(CallbackType Callback)
{
...
Callback(args)
...
}
Jetzt können Sie ein Funktor-Objekt definieren, das die folgenden Funktionen überlädt operator()
und übergeben eine Instanz dieses Objekts an die Funktion. Diese Instanz erhält den Rückruf, und alle Zwischenergebnisse, die Sie speichern möchten, können in diesem Instanz .
Mit anderen Worten, es ist ein guter Weg, um Globals zu vermeiden (:
Ich bin mir sicher, dass es noch andere Verwendungszwecke gibt, aber das ist ein guter, IMO.