Functor vs Function vs Lamda



  • Wann benutzt man Functoren, wann statt eines Functors eine Funktion und wann statt eines Functors eine Lamda Function? Ergibt ein Functor überhaupt noch Sinn, oder ist dieser seit Lamda überflüssig?

    Beispiel etwa:

    struct FunctorMultiplikator{
        FunctorMultiplikator(int _a, int _b) : a(_a), b(_b) {}  
        int operator()( int a, int b ) const {return a * b;}
    private:
        int a;
        int b;   
    };
    
    int FunctionMultiplikator(int a, int b) {
        return a*b;      
    }
    
    
    FunctorMultiplikator functorMulti(7,7);
    int multi1 = functorMulti(7,7) * functorMulti(7,7);
    
    int multi2 = FunctionMultiplikator(7,7) * FunctionMultiplikator(7,7);
    

    Welchen Gewinn habe ich mit der Benutzung von Functoren?

    Danke für die Hilfe.



  • Einen Functor/Lambda nutzt man, wenn man Funktion mit Zustand benötigt, die auch sauber kontrolliert initialisiert werden muss. Man kann zwar bei einer Funktion den Zustand in statischen Variablen speichern, aber die Initialisierung muss dann ebenfalls über die Funktionsparameter erfolgen und dann wird bei jeder Verwendung diese Parameter unnötig mit übergeben.

    Was das Thema Lambdas vs. Functors betrifft, darüber kann man einen Glaubenskrieg auslösen.



  • Ein Lambda ist letzt Endes auch nur ein Funktor.

    Für wiederverwendbare Konstrukte wie z.B. std::less dürfte ein Lambda wohl eher nicht so schön sein.

    Lambda/Functor kann der Compiler in der Regel besser inlinen, d.h. z.B. STL Algoritrhmen werden damit besser optimiert.


Log in to reply