IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Developer123
Člen
Avatar
Developer123:2.9.2019 17:52
  1. Co pouzit aby som niekde mohol dosadit hodnotu / premennu hociakeho typu. Viem ze C++ nema spolocneho predka pre vsetky typy tak ako napriklad C# (System.Object), ale existuje k tomu nejaka alternativa? cim sa to zvykne nahradit? Ak si odmyslime parametricky polymorfizmus a genericke parametre. Pointerom na void? Ci existuje aj nieco sofistikovanejsie.
  2. potrebujem typovu reprezentacia hociakej funkcie s hociakym poctom parametrov hociakeho typu a s navratovou hodnotou tiez hociakehop typu. Napr:

void wrapper(TYPOVA_REP­REZENTACIA_VSET­KYCH_FUNKCII funkcia) {
...
}
TYPOVA_REPREZEN­TACIA_VSETKYC­H_FUNKCII = ???
Teda ked niekde zadam nazov toho typu ktory reprezentuje vsetky funkcie tak tam mozem dosadit hocico co sa da zavolat (funkciu, proceduru, metodu atd). Napr v JS je to predok vsetkych funkcii typ Function. Viem ze C++ nema objektovu hierarchiu (ak si ju sam nevytvorim) takze funkcie nemaju spolocneho predka, ale myslim ze by malo existovat nieco cim sa to da nahradit.
3. ako zistim pocet parametrov funkcie? Podla moznosti by som chcel aj variantu v compile-time aj v runtime (aj ked ocakavam ze v runtime sa to asi zistit neda)

Odpovědět
2.9.2019 17:52
YOLO
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Developer123
Martin Dráb:2.9.2019 20:16
  1. Pro objekty alokované na haldě můžeš použít ukazatel na void, ale nejedná se samozřejmě o objekt, jen prostě o ukazatel na cokoliv.
  2. Můžeš postupovat podobně jako v prvním případě. Použiješ opět ukazatel na void, nebo třeba typ funkce bez návratové hodnoty a bez parametrů (něco jako void (void)). V případě volání ji prostě vždy přetypuješ na požadovaný počet argumentů a návratovou hodnotu. Existuje šablona std::function, ale tou nemůžeš obecně reprezentovat libovolnou funkci (resp. pomocí šablonovaných parametrů vlatně určuješ její přesný typ).
  3. V compile-time by to mohlo jít (mohla by existovat nějaká šablonka), v runtime těžko. C++ zatím nemá reflexi.
Editováno 2.9.2019 20:18
Nahoru Odpovědět
2.9.2019 20:16
2 + 2 = 5 for extremely large values of 2
Avatar
Developer123
Člen
Avatar
Odpovídá na Martin Dráb
Developer123:2.9.2019 23:11

Dakuejm za odpovede:

  1. to sa mi aj celkom páči že to neni objektové. oop síce veľa vecí zjednodušuje, akurát programátor potom nerozumie ako veci fungujú "pod pokličkou" však aj tie objektové jazyky používajú pointery len ich potom skrývajú pred programátorom (aby náhodou niečo nepokazil)
  2. vidím že templaty toho dokážu celkom dosť (aspoň z toho čo som doteraz googlil a skúšal). K C++ som sa dostal pred pár dňami len úplnou náhodou kôli jedného projektu lebo som si povedal že jedna časť toho projektu asi najlepšie pôjde v C++. A čím viac ten jazyk skúšam tým viac ma baví. Nejaké základy už síce mám ale spred 20 rokov ale ten jazyk sa medzitým strašne zmenil. Takže sa ho idem naučiť. Pred chvíľou som si objednal dve hrubé knihy, síce je to len pre verziu C++ 14 ale to podstané tam snáď bude a ostatné novinky zo 17ky si nájdem na internete. našiel som aj nejakú templatu is_callable to by mi možno mohlo pomôcť. Ale ajtak musím sa tie šablóny poriadne naučiť
  3. no vlastne v compile time to bude stačiť veď ajtak si môžem urobiť šablónu ktorá obalí funkciu zistí si o nej všetko ešte počas komilácie a uloží to do nejakej konštanty a dáta budem mať k dispozícii aj za behu takže sa to bude tváriť ako keby tam bola reflexia.
Nahoru Odpovědět
2.9.2019 23:11
YOLO
Avatar
Martin Dráb
Tvůrce
Avatar
Martin Dráb:3.9.2019 9:10
  1. výraz celkem dosť je podcenění toho, co šablony dokáží, z teoretického hlediska v nich můžeš implementovat libovolný algoritmus (bude vykonán při překladu), rozhodně se nejedná o něco na způsob generik z Javy, Delphi a podobných jazyků.

Přelomovou verzí byla C++11.

Nahoru Odpovědět
3.9.2019 9:10
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.