Untersuchung der Operator()-Überladung in C: Funktoren und generische Programmierung
Überladung des ()-Operators in C, wie in den Boost-Signalen zu sehen Bibliothek, wirft Fragen zu ihrem Zweck und ihrer Konventionalität auf. Lassen Sie uns die Gründe für diese Praxis genauer untersuchen.
Funktoren: Überbrückung der Funktions- und Objektwelten
Operator()-Überladung spielt eine entscheidende Rolle bei der Erstellung von Funktoren, einem einzigartigen Konstrukt das funktionsähnliches Verhalten mit Zustandsbezogenheit verbindet. Funktoren behalten ihren internen Zustand zwischen Aufrufen bei, sodass sie sich an vergangene Vorgänge erinnern können.
Beispiele für Funktoren
Betrachten Sie den folgenden Akkumulator-Funktor:
struct Accumulator { int counter = 0; int operator()(int i) { return counter += i; } };
Generische Programmierung: Integrieren Sie Ihre Logik
Funktoren finden breite Anwendung in der generischen Programmierung, bei der Algorithmen mit einer Reihe von Elementen mithilfe einer vom Benutzer bereitgestellten Funktion oder eines Funktors arbeiten. Diese Flexibilität wird im std::for_each-Algorithmus demonstriert:
template <typename InputIterator, typename Functor> void for_each(InputIterator first, InputIterator last, Functor f) { while (first != last) f(*first++); }
Komfort von Operator()
Die Operator()-Überladung ermöglicht sowohl Funktoren als auch Funktionszeiger zum Einbinden in generische Algorithmen. Betrachten Sie zum Beispiel dieses Beispiel:
void print(int i) { std::cout << i << std::endl; } ... std::vector<int> vec; // Fill vec // Using a functor Accumulator acc; std::for_each(vec.begin(), vec.end(), acc); // acc.counter contains the vector sum // Using a function pointer std::for_each(vec.begin(), vec.end(), print); // prints all elements
Mehrere ()-Operatoren: Eine Möglichkeit
Entgegen der landläufigen Meinung ist es tatsächlich möglich, den Operator() mehrfach zu überladen Mal in einer einzigen Klasse. Gemäß den Methodenüberladungsregeln müssen sich die Rückgabetypen unterscheiden.
Das obige ist der detaillierte Inhalt vonWarum den „Operator()' in C überladen? Funktoren und die Macht der generischen Programmierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!