Wie kann es sein nützlich, um eine überlastung der "function call" - Betreiber?
Vor kurzem habe ich entdeckt, dass in C++ können Sie die überlastung der "function call" - Betreibers, in einer seltsamen Art und Weise, in dem Sie haben zu schreiben, sind zwei paar Klammern zu tun:
class A {
int n;
public:
void operator ()() const;
};
Und dann diese Art der Nutzung:
A a;
a();
Wann ist dies nützlich?
Lesen Sie über die Funktion von Objekten. en.wikipedia.org/wiki/Function_object
InformationsquelleAutor lurks | 2010-02-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese können verwendet werden, um "funktoren", Objekte, die handeln, wie Funktionen:
Den oben genannten Drucke
20
. Der Wikipedia-Artikel weiter oben verlinkt gibt weitere wesentliche Beispiele.Sie könnten erweitern Sie diese um, zum Beispiel, multiplizieren Sie mit m das erste mal Sie es nennen, multipliziert mit m+1 das zweite mal, usw. Normale Funktionen können nicht speichern Sie alle Status-Informationen zwischen aufrufen, aber funktoren können.
Auch können Sie immer mit statischen Variablen in einer Funktion zu geben es Staat (oder globals - Schauer). Aber beide sind sehr hässlich und fehleranfällig. (Ich würde verwenden einen Funktor statt .. aber es ist möglich)
InformationsquelleAutor Greg Hewgill
Gibt es wenig mehr als eine syntaktische gewinnen in die Verwendung von operator (), bis Sie anfangen, templates zu verwenden. Aber bei der Verwendung von Vorlagen, die Sie behandeln können reelle Funktionen und funktoren (Klassen fungieren als Funktionen) auf die gleiche Weise.
InformationsquelleAutor Michael Anderson
Einen Algorithmus implementiert, die eine Vorlage verwenden, egal ob das Ding genannt wird, ist eine Funktion oder Funktor, Sie kümmert sich um die syntax. Entweder standard (z.B. for_each()) oder Ihre eigenen. Und funktoren können einen Status haben, und tun alle möglichen Dinge, die, wenn Sie aufgerufen werden. Funktionen können nur im Zustand mit eine statische lokale variable oder Globale Variablen.
InformationsquelleAutor paul
Wenn du eine Klasse kapselt eine Funktion Zeiger, das könnte die Nutzung noch deutlicher.
InformationsquelleAutor Reed Copsey
Kann der compiler auch die inline-funktors und die Funktion aufrufen. Es können keine inline-Funktion Zeiger, jedoch. Auf diese Weise, mit dem Aufruf der Funktion Bediener kann deutlich die performance verbessern, wenn es verwendet wird, zum Beispiel mit der standard C++ Bibliothek für algorithmen.
InformationsquelleAutor fintux
Beispielsweise für die Implementierung von Generatoren:
InformationsquelleAutor Quonux
Sehe ich Potenzial, um noch eine exotische Nutzung:
Angenommen, Sie haben Objekt unbekannten Typs und deklarieren eine andere variable des gleichen Typs, wie diese:
Wenn solche Muster ausgiebig genutzt, decltype geworden, sehr ärgerlich.
Dieser Fall kann auftreten, wenn einige smart-Art-system, das automatisch erfinden Ergebnistyp von Funktionen und Operatoren, basierend auf die Typen der Argumente.
Nun, wenn jede Spezialisierung für jeden Typ von diesem Typ-system ausgestattet mit
Magie-definition von
operator()
wie diese:decltype()
nicht mehr benötigt, können Sie einfach schreiben:Da operator() des Objektes leitet an den Konstruktor seiner eigenen Typ.
InformationsquelleAutor Lexey