#include <iostream>
using namespace std;
/*
FUNKTOR (FÜGGVÉNYOBJEKTUM):
---------------------------
- Olyan osztály/struct példány, amelynek van operator() tagfüggvénye.
- Így úgy hívható, mint egy függvény: obj(args...).
- Előny: lehet BENNE ÁLLAPOT (pl. beállított paraméter), amit a hívások felhasználnak.
- A fordító sokszor jobban optimalizálja (inline), mint az általános std::function-t.
*/
// 1) ÁLLAPOT NÉLKÜLI funktor: csak a kapott paraméterekből dolgozik.
struct Osszead {
// const: a hívás nem módosítja a funktor objektum állapotát (nincs is állapota).
int operator()(int a, int b) const {
return a + b;
}
};
// 2) ÁLLAPOTOS funktor: konstruktorban kapott skálázó tényezőt ELMENTI, és használja.
struct SkalarSzorzo {
double c; // "állapot": minden híváskor ezt használjuk szorzónak
explicit SkalarSzorzo(double c_) : c(c_) {} // explicit: a konstruktor nem használható rejtett, automatikus típuskonverzióra.
// SkalarSzorzo sz = 2.0; FORDÍTÁSI HIBA, mert explicit
double operator()(double x) const {
return c * x; // a hívás a belső állapottal dolgozik
}
};
// --- A main számára egyszerű, header nélküli "wrap" függvények ---
int osszead_funktor_hivas(int a, int b) {
Osszead f; // létrehozunk egy funktort
return f(a, b); // úgy hívjuk, mint egy függvényt
}
double skalar_szorzo_hivas(double c, double x) {
SkalarSzorzo sz(c); // beégetjük az állapotot
return sz(x); // majd alkalmazzuk a bemenetre
}