MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Obiecte funcție și expresii lambda

Obiecte funcție

Un obiect funcție (function object) sau functor este un obiect care poate fi apelat ca o funcție. Pentru aceasta se folosește operatorul (). Să vedem un exemplu simplu:

#include <iostream>
  
class Print
{
public:
    void operator()(const std::string& message) const
    {
        std::cout << message << std::endl;
    }   
};
 
int main()
{
    Print print;    // definim obiectul funcție
    print("Hello"); // apelăm ca pe o funcție
    print("World");
}

Aici este definită clasa Print. În ea este definită funcția operator (), care primește un parametru — un șir de caractere și nu returnează nimic. În interiorul funcției operator afișăm șirul transmis pe consolă.

Numărul parametrilor funcției operator, tipul lor și valoarea returnată pot fi definite după necesități. Operatorul poate fi definit doar ca funcție-membru a clasei.

Apoi definim un obiect al clasei și îl apelăm ca pe o funcție, trecând un argument:

print("Hello");

Alt exemplu:

#include <iostream>
 
class Sum
{
public:
    int operator()(int x, int y) const  { return x + y; }   
};
 
int main()
{
    Sum sum;    // definim obiectul funcție
    int result {sum(2, 3)};     // apelăm obiectul funcție
    std::cout << result << std::endl;    // 5
    std::cout << sum(5, 3) << std::endl;    // 8
    std::cout << sum(12, 13) << std::endl;  // 25
}

Aici clasa Sum definește operatorul funcție care primește două numere și returnează suma lor. Deoarece operatorul returnează un int, putem salva rezultatul într-o variabilă de tip int și îl putem folosi ca atare.

Obiectele funcție pot stoca și un anumit stare internă:

#include <iostream>
  
class Id
{
public:
    unsigned operator()()
    {
        return ++id;
    } 
private:
    unsigned id{};
};
 
int main()
{
    Id id;    // definim obiectul funcție
    std::cout << id() << std::endl;     // 1
    std::cout << id() << std::endl;     // 2
    std::cout << id() << std::endl;     // 3
}

Aici obiectul funcție Id returnează valoarea variabilei private id după incrementare.