Ugrás a tartalomhoz

function call operator

A Wikiszótárból, a nyitott szótárból


Főnév

function call operator (tsz. function call operators)

  1. (informatika) A function call operator (operator()) C++-ban egy túlterhelhető operátor, amely lehetővé teszi, hogy egy objektumot úgy hívjunk meg, mint egy függvényt. Az ilyen objektumot gyakran functor-nak (funkcióobjektumnak) nevezik.



🧠 Alapötlet

Ha egy osztály operator()-t implementál, akkor példányait zárójelekkel meghívhatjuk, mint egy függvényt.

Példa:

class Negyzet {
public:
    int operator()(int x) const {
        return x * x;
    }
};

Negyzet f;
std::cout << f(5);  // Kiírja: 25

🧱 Szintaxis

VisszateresiTipus operator()(Paraméterek) const {
    // működés
}
  • Lehet paraméter nélküli, vagy tetszőleges paraméterlistás.
  • Lehet const, ha a hívás nem módosítja az objektum állapotát.
  • Lehet template, ha többféle típuson is működnie kell.



🎯 Mire használjuk?

Használat Példa
Funktor egy std::sort-hoz Egyedi összehasonlító
Állapottal rendelkező függvény Lambda alternatíva állapottal
Általános függvényobjektum Pl. std::function, std::bind
Operátor túlterhelés Matematika, gépi tanulás, jelzésfeldolgozás



📦 Példa – Több paraméter

class Osszeg {
public:
    int operator()(int a, int b) const {
        return a + b;
    }
};

Osszeg add;
std::cout << add(3, 4);  // 7

📁 Állapotot tároló funktor

class Szorzo {
    int szorzo;
public:
    Szorzo(int s): szorzo(s) {}

    int operator()(int x) const {
        return x * szorzo;
    }
};

Szorzo haromszor(3);
std::cout << haromszor(5);  // 15

🧮 Használat STL-ben

Példa: std::sort saját összehasonlítóval

struct Forditott {
    bool operator()(int a, int b) const {
        return a > b;  // Csökkenő sorrend
    }
};

std::vector<int> v = {1, 5, 3};
std::sort(v.begin(), v.end(), Forditott());

🧩 Template alapú funktor

template<typename T>
class Negyzet {
public:
    T operator()(const T& x) const {
        return x * x;
    }
};

Negyzet<double> sq;
std::cout << sq(3.14);  // 9.8596

🔗 Lambda alternatíva

A funktorokat gyakran kiváltják lambda kifejezések, de funktorral állapotot is tárolhatsz:

auto lambda = [](int x) { return x * x; };

Ugyanez funktorral:

struct LambdaPótlék {
    int operator()(int x) const { return x * x; }
};

🧪 std::function és funktorok

#include <functional>

std::function<int(int)> f = Negyzet();
std::cout << f(4);  // 16

Ez lehetővé teszi, hogy funktorokat kezeljünk absztrakt módon, például paraméterként átadva.



⚠️ Buktatók

Probléma Megoldás
Nem const operator → nem használható const objektumon Adj hozzá const kulcsszót
Hibás paraméterlista Túlterhelés vagy sablon szükséges
Állapotváltoztatás Ne feledd, a const megakadályozza



📘 Összegzés

  • Az operator() segítségével objektumokat függvényszerűen hívhatunk meg.
  • Így saját funktorokat készíthetünk, amelyek állapotot is képesek tárolni.
  • Hasznos STL algoritmusoknál, például: sort, for_each, transform.
  • A [] lambda alternatívája, komplexabb vagy újrahasznosítható kódnál különösen hasznos.
  • Teljes mértékben túlterhelhető, sablonosítható, és jól illeszkedik a modern C++ stílushoz.