function call operator
Megjelenés
Főnév
function call operator (tsz. function call operators)
- (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.
- function call operator - Szótár.net (en-hu)
- function call operator - Sztaki (en-hu)
- function call operator - Merriam–Webster
- function call operator - Cambridge
- function call operator - WordNet
- function call operator - Яндекс (en-ru)
- function call operator - Google (en-hu)
- function call operator - Wikidata
- function call operator - Wikipédia (angol)