2011-01-14 8 views
4

mögliche Dubletten:
C++ Functors - and their uses.
Why override operator() ?Function Call-Betreiber

Ich habe die Verwendung von operator() auf STL-Container gesehen, aber was ist es und wann Sie es verwenden?

+0

Danke, das deckt es ab. – george

+1

@ Troubadour: ziemlich wahrscheinlich, aber jemand, der nicht weiß, was die Verwendung von 'operator()' ist, ist unwahrscheinlich zu wissen, was ein Funktor ist und würde nicht nach dieser Frage suchen. – Gorpik

+0

@Gorpik: Ja, aber ich denke, selbst die rudimentärste Suche würde die Beziehung zwischen 'operator()' und Funktoren aufdecken. – Troubadour

Antwort

6

Dieser Operator verwandelt Ihr Objekt in Funktor. Here is nice example of how it is done.

Nächstes Beispiel zeigt, wie eine Klasse implementieren sie als Funktors zu verwenden:

#include <iostream> 

struct Multiply 
{ 
    double operator()(const double v1, const double v2) const 
    { 
     return v1 * v2; 
    } 
}; 

int main() 
{ 
    const double v1 = 3.3; 
    const double v2 = 2.0; 

    Multiply m; 

    std::cout << v1 << " * " << v2 << " = " 
       << m(v1, v2) 
       << std::endl; 
} 
+0

Das ist ein Weg über komplexes Beispiel gut zu sein. +1, wenn Sie Ihrer Antwort ein schönes Beispiel hinzufügen, anstatt es zu verknüpfen. –

+0

@Martin Ist oben gut genug? Dieselbe könnte mit einer Funktion archiviert worden sein. –

3

Es macht das Objekt „aufrufbar“ wie eine Funktion. Im Gegensatz zu einer Funktion kann ein Objekt einen Zustand halten. Tatsächlich kann eine Funktion dies in einem schwachen Sinne tun, indem sie ein statisches Local verwendet, aber dann ist dieses statische Local permanent für jeden Aufruf dieser Funktion da, der in irgendeinem Kontext von irgendeinem Thread erzeugt wird.

Mit einem Objekt, das als Funktion fungiert, ist der Status nur ein Mitglied dieses Objekts, und Sie können andere Objekte der gleichen Klasse haben, die ihren eigenen Satz von Elementvariablen haben.

Die Gesamtheit von boost :: bind (die auf den alten STL-Bindern basierte) basiert auf diesem Konzept.

Die Funktion hat eine feste Signatur, aber oft benötigen Sie mehr Parameter, als tatsächlich in der Signatur übergeben wurden, um die Aktion auszuführen.