Delegate osztly implementlsa C++ nyelven

A kutats clja egy olyan function-like objektum ltrehozsa volt, amely lehetv teszi, hogy klnbz tpus objektumokat tudjunk tadni egy olyan osztlynak, mely ezeket trolja s felhasznlja. A tesztelshez egy parancssz rtelmezt (Command Interpreter) hasznlunk, mely std::unordered_map knt trolja el az objektumokat a hozzjuk tartoz parancsokkal prban. Mivel ezek az objektumok lehetnek osztlyok tagfggvnyei, szabad fggvnyek, lambdk, illetve funktorok (olyan osztly, melyben a fggvnyhvs opertor definilva van) is, szksges egy kztes osztly ltrehozsa mely kpes ezen objektumok egysges trolsra s a rajta keresztl trtn meghvsra. Ez az osztly a Delegate nevet kapta, amit a C# nyelv mr tartalmaz beptve, C++ esetn viszont szksges az implementcija. Ahhoz, hogy ezek az objektumok mind kezelhetek legyenek, az osztly implementl egy fggvnyt, mely ezeket csatlakoztatja. Template-ek hasznlatval minden egyes objektumhoz elkszlt a fggvny tlterhelse(function overload). Ezen kvl az osztly implementlja tovbb a () opertort is a fggvnyek meghvshoz. Ehhez az std::invoke mechanizmus kerlt felhasznlsra. Az osztly privt vltoz az tadni kvnt fggvny fggvnymutatknt, valamint az azt tartalmaz objektum this mutatja. Az invoke mechanizmus ezeket, illetve a template argumentum listjban tadott paramtereket s visszatrsi rtkeket hasznlja fel. A legegyszerbb eset a szabad fggvnyekkel trtn felhasznls, ahol ugyanis elegend a visszatrsi rtk, az argumentumok, illetve a fggvny cmnek megadsa. Az objekum helyett pedig null mutat kerl eltrolsra. Tagfggvnyek esetn szksges az sszekapcsolst implementl fggvnynek paramterknt a tagfggvnyt tartalmaz objektum tadsi is, referenciaknt. Funktorok esetn hasonl a felhasznls, mint szabad fggvnyeknl, viszont template-knt a fggvny tpusn kvl a funktor osztlyt is meg kell adnunk. Lambda fggvnyekkel trtn hasznlathoz template-knt a lambda tpust, valamint paramterknt magt az objektumot kell tadnunk. Az esetleges hibs hasznlat elkerlsnek cljbl az std::is_invocable_r_v fggvny kerlt felhasznlsra static_assert argumentumban. Ezek utn elg az j Delegate osztlyt a megfelel template paramterekkel pldnyostanunk, tadni a hasznlni kvnt objektumot, majd pedig a parancssz rtelmeznek ezt a Delegate objektumot tadni. gy lehetsgnk nylik arra, hogy fggvny-tpus objektumokat egysgesen tudjunk hasznlni C++ nyelven.

Csata Dniel

2024-02-29

Tmogat: B. Braun Medical Kft.