Jakožto hobbík a lopata odkojená packalem a základy x86 ASM nabídnu ještě svůj příběh, jak a kde jsem potkal functor:
Před lety, už dávno po škole, jsem potkal programátorský problém natolik zábavný a složitý, že donutil ten kus hovězího co nosím v lebce, zamýšlet se nad OOP a snažit se ho ztéci (s odpuštěním) cestou C++. Průvodcem mi byl pan Bruce Eckel.
Dodnes nechápu, proč svoji dvoudílnou knihu "Thinking in C++", když už ji zveřejnil v HTML, vystavil ji v podobě dvou ZIPů, tzn. nevystavil to HTML na webu přímo, aby bylo přímo odkazovatelné, googlovatelné apod. Nevadí. O functorech resp. "function objectech" mluví cca na dvou navzájem dost vzdálených místech v
druhém dílu. Najděte v ZIPu jediný HTML soubor a hledejte text "functor". Dovolím si dva citáty:
In Advanced C++: Programming Styles And Idioms (Addison Wesley, 1992), Jim Coplien coins the term functor which is an object whose sole purpose is to encapsulate a function (since “functor” has a meaning in mathematics, we shall use the more explicit term function object). The point is to decouple the choice of function to be called from the site where that function is called.
Tohle chápu tak, že functor je jenom objekt, obalující funkci, tak aby se dala předat jako parametr. Tzn. v této rovině je to jenom "zaobjektěná náhražka" klasické Céčkové syntaxe pro předání pointeru na funkci včetně úplného prototypu. A v zásadě není ani potřeba, aby ten functor obsahoval redefinici metody "operator()".
Sám Bruce Eckel raději hovoří o "function objectech" než o functorech, a jeho druhý díl o tom obsahuje samostatnou kapitolu. Podotýkám, že ta kniha je na dnešní poměry už dost stará.
Děkuji předřečníkům za vysvětlivku, že lze overloadnout operator().
Kdysi tuším na nějakých "gtree" objektech jsem se naučil, podstrčit stromu svou vlastní porovnávací funkci. Později jsem totéž hledal u std::map, a seznal jsem, že std::map toto také umí, ale vyžaduje, abych tu porovnávací funkci zabalil do "functoru". Tak jsem si našel nějaký example a levou zadní jsem to použil, aniž bych zkoumal nějaký hlubší smysl.
Dneska když tak kolem toho browsím, našel jsem nějaký
example na Stack Overflow.