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