#include <functional> // std::function
using namespace std;
/*
HÍVHATÓK ÖSSZEHASONLÍTÁSA:
--------------------------
1) Függvénymutató: olcsó, de csak szabad / statikus függvény mutatható vele.
2) Lambda/funktor: konkrét típus, gyors lehet (inline), állapot is lehet benne.
3) std::function: rugalmas (típus-erasure), de kis overhead előfordulhat.
Irányelv:
- Belső "hot path": konkrét típus (lambda/funktor) sablon paraméterként.
- Általános API/felhasználó felől érkező hívható: std::function<...>.
*/
// Szabad függvény, amire mutathat a függvénymutató
static int duplaz_impl(int x) { return 2 * x; }
int duplaz_fvptr(int x) {
// Függvénymutató létrehozása és hívása
int (*pf)(int) = &duplaz_impl;
return pf(x);
}
int lambda_pluszegy(int x) {
// Egyszerű állapot nélküli lambda
int (*ignore)(int) = 0; (void)ignore; // csak hogy lássuk: itt is int(int) a "shape"
auto h = [](int v) { return v + 1; };
return h(x);
}
int std_function_valtas(int x, int mode) {
// std::function-be tetszőleges "int(int)" hívható betehető
std::function<int(int)> f;
if (mode == 0) {
// lambda
f = [](int v) { return v + 1; };
}
else {
// függvénymutató
f = &duplaz_impl;
}
return f(x);
}