C++-Programmierung/ Die STL/ Funktionsobjekte

Aus Wikibooks
Zur Navigation springen Zur Suche springen


Jedes Objekt, das operator() implementiert, ist ein Funktor bzw "Funktionsobjekt". Die STL verwendet Funktoren zum Sortieren in Algorithmen oder Containern. Grundsätzlich ist ein Funktor eine einfache operator() - Überladung in einem definierten Typ.

Beispiel einer Typdefinition, Implementation von operator() und eines Aufrufs:

Nuvola-inspired-terminal.svg
 1 class MeinFunktor{
 2 public: 
 3     unsigned operator() (unsigned a, unsigned b){
 4         return (a + b);
 5     }
 6 };
 7  
 8 int main(){
 9     MeinFunktor fX;         // Instantiierung
10     unsigned x = 19;              
11     unsigned y = 19;
12     unsigned z = fX(x, y);  // Aufruf, 'z' enthält nun 38
13     return (static_cast<int> (z));
14 }

Funktionsobjekte sind für die Verwendung der STL-Containerklassen von Wert und können zur Modifikation, Überprüfung und für Anpassungen gesammelter Objekte in Containern verwendet werden, wir verwenden im Folgenden einen Funktor, der eine Referenz auf einen vorzeichenlosen Integraltyp erhält, dann übergeben wir den Konstruktor des Funktors an die for_each Funktion aus <algorithm> (durchläuft alle Containerinhalte von einem Startiterator bis zu einem Enditerator, wendet auf jeden Eintrag einen Funktor an:

Nuvola-inspired-terminal.svg
 1 class AnpassFunktor(){
 2 public: 
 3     void operator() (unsigned & a){
 4         if (a > 50) a = 0;  // Alle Werte über 50 werden auf 0 gesetzt
 5     }
 6 };
 7 
 8 int main(){
 9     std::vector<unsigned> contZahlen;  // STL-Vektor für unsere Zahlen
10            // Hier wird der Container gefüllt
11     std::for_each(contZahlen.begin(), contZahlen.end(), AnpassFunktor());
12            // Nun ist jeder Wert über 50 auf 0 gesetzt worden
13 }

Ein weiterer üblicher Anwendungsfall ist die Übergabe einer (STL-)Vergleichsfunktion an eine (STL-)Containerklasse um diese nach gewissen Vorgaben zu untersuchen. In gewissen Fällen ist durch derartige Verfahren ein erheblicher Übersichtlichkeitsgewinn bei der Entwicklung von großen Sammlungen komplexerer Typen in STL-Containerklassen möglich; zum Beispiel ein typedef list<MeinContainerEintragsTyp> listDaten, der dann eine Sortierung anhand verschiedener Mitglieder von MeinContainerEintragsTyp benötigt.

Die STL stellt dem Programmierer eine Sammlung von Funktionen zur Verfügung die helfen Funktionsobjekte zu erstellen. Diese Vorlagen befinden sich in <functional>