C++-Programmierung/ Die STL/ Funktionsobjekte


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
class MeinFunktor{
public: 
    unsigned operator() (unsigned a, unsigned b){
        return (a + b);
    }
};
 
int main(){
    MeinFunktor fX;         // Instantiierung
    unsigned x = 19;              
    unsigned y = 19;
    unsigned z = fX(x, y);  // Aufruf, 'z' enthält nun 38
    return (static_cast<int> (z));
}

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
class AnpassFunktor(){
public: 
    void operator() (unsigned & a){
        if (a > 50) a = 0;  // Alle Werte über 50 werden auf 0 gesetzt
    }
};

int main(){
    std::vector<unsigned> contZahlen;  // STL-Vektor für unsere Zahlen
           // Hier wird der Container gefüllt
    std::for_each(contZahlen.begin(), contZahlen.end(), AnpassFunktor());
           // Nun ist jeder Wert über 50 auf 0 gesetzt worden
}

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>