Re: Typické použití funktorů?
Miroslav Mraz
mrazik na volny.cz
Čtvrtek Březen 2 10:35:58 CET 2023
No tak dobře, chvíli tomu věnovat můžu. Google na mne vyplivl jako první
tohle
https://www.geeksforgeeks.org/functors-in-cpp/
Z toho vyplývá, že jako funktor zde označují třídu, která má přetížený
operátor (). Já tomu říkám "volatelný" (callable) objekt. Fakticky je to
příklad funkcionálního programování, kde místo toho abyste říkal _jak_
se to má udělat, říkáte jen _co_ se má udělat - tedy provést jakousi
transformaci transform(), která jako poslední parametr akceptuje
ukazatel na funkci, functor a zřejmě i lambdu. V takto jednoduchém
příkladu byste asi napsal místo transform()
for (int & e: arr) e += increment;
bez toho balastu okolo ale to už není správně funkcionální.
Já už jsem starší člověk, tyhle finty mi připadají, že mládež už je líná
se něco naučit a hledá způsoby, jak si práci usnadnit. Nebyli jsme jiní.
A funkcionální zápis vypadá, že to nějak půjde - proč sakra vysvětlovat
překladači, jak přesně má algoritmus fungovat, když stačí popsat mu to
nějakým jednoduchým (matematickým) výrazem a ať si to překladač nějak
přebere. A nakonec se objevily vícejádrové procesory a bylo potřeba
nějak je zkrotit a funkcionální zápis se jeví jako dobrá cesta.
Co se týká té Wikipedie našel jsem
https://cs.wikipedia.org/wiki/Funktor
První věta se odkazuje na teorii kategorií a co jsem pochopil z diskusí
na root.cz, lidi co se tím zabývají jsou něco jako sekta, která dovnitř
nikoho jen tak nepustí. A ostatní si z toho začínají dělat srandu
https://cs.wikipedia.org/wiki/Abstraktn%C3%AD_nesmysl
Možná někdo, kdo to chápe časem zpřístupní tuto část matematiky i
normálním lidem tak jak to dělá třeba prof. Kulhánek, patrně je ještě brzy.
Takže moje odpověď na otázku jak správně používat funktory je nijak. Ne,
že bych to nikdy nepoužil, ale uvědomte si, že kód po vás bude možná
číst i někdo jiný a bude chtít tomu rozumět. Přetěžování operátorů je
hezká věc, ale snažím se tomu pokud možno vyhnout. V bare-metal se dají
použít lambda výrazy, novější syntaxe for(), šablony, constexpr výrazy a
asi i jiné vychytávky. Ale vše se musí používat rozumně. Psát všechno v
šablonách jen proto, že kdosi dokázal, že jsou Turingovsky kompletní je
blbost.
Mrazík
On 02. 03. 23 0:11, Pavel Hudeček wrote:
> Zrovna z tohoto směru jsem očekával nějaké povídání v obou významech:-)
>
> Funktor v C++ je příbuzný lambda funkcí a jedná se v podstatě o
> přetížení operátoru (). Typická divná věc, která má nepochopitelné
> použití, ... až do "Aha okamžiku" náhodného setkání se situací, kde se
> to hodí.
>
> Pak má ještě matematický význam ale můj závěr je, že CZ wiki v tomto
> případě hovoří cizím jazykem:-)
>
> PH
Další informace o konferenci Hw-list