Tak jsem myslel, že na to někdo odpoví "po lopatě" (to je totiž hezky česky)....
Po lopatě, funktor je kontejner, který má operaci pro práci s prvky, co jsou uvnitř, která splňuje nějaké základní náležitosti (aby se to dalo považovat za kontejner).
"template<typename T> class C" je schopné být funktor, protože ta funkce, která dělá něco s tím, co je uvnitř, může taky měnit ten typ.
Ta operace se jmenuje "fmap", vypadá jako "C<T2> fmap(f, C<T1>)" a "f" je "T2 f(T1)". Typická implementace je, že to pro každý prvek toho kontejneru zavolá tu funkci "f", prvek vymění za nový a vrátí výsledek (může se změnit typ). A aby to splňovalo tu představu "kontejneru", tak to musí splňovat, že
id(x) { return x; }
fmap(id, container) == container
sloz(x) { return p(q(x)) }
fmap(sloz, container) == fmap(p, fmap(q))
(C++ syntaxi pořádně neumim, tak je to trochu pseudo)
Třeba takový generický "seznam" je funktor - operace fmap se zavolá pro každý prvek a vrátí se výsledek. Optional je funktor - když v něm nic není, vrátí nic, jinak zavolá tu funkci a vrátí nový optional s jiným výsledkem. Hashmapa je funktor - fmap se volá na hodnoty. Funkce je funktor; fmap se zavolá na výsledek funkce (vlastně složení funkcí).
Jinak tady to je i s tou teorií i C++ příklady:
https://bartoszmilewski.com/2015/01/20/functors/