abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 06:00 | Komunita

    Vydání Debianu 11 s kódovým jménem Bullseye je naplánováno na sobotu 14. srpna.

    Ladislav Hagara | Komentářů: 3
    včera 23:55 | Nová verze

    Google Chrome 92, konkrétně verze 92.0.4515.107, byl v úterý prohlášen za stabilní. Opraveno bylo 35 bezpečnostních chyb. Pete LePage doteď nepublikoval oficiální přehled novinek (New in Chrome, YouTube). Publikován byl jenom seznam novinek v nástrojích pro vývojáře (YouTube). Sundar Pichai dnes na Twitteru oznámil vylepšení integrované hry chrome://dino/.

    Ladislav Hagara | Komentářů: 5
    včera 08:00 | Nová verze

    Firewall firewalld (Wikipedie, GitHub) dospěl do verze 1.0.0. Upozornit je nutno na nekompatibilní změny. Zrušena byla podpora Pythonu 2.

    Ladislav Hagara | Komentářů: 0
    včera 01:11 | Komunita

    Milí priatelia Mozilly, tím Mozilla.sk hľadá pomoc v radoch dobrovoľníkov, ktorí sú ochotní pomáhať nám s týmto projektom. Vítaná je akákoľvek pomoc, no aktuálne hľadáme hlavne ľudí, ktorí by sa starali o aktuálnosť lokalizovaných článkov na stránkach podpory SUMO. Projekt je doteraz veľmi sviežo udržiavaný, no naše kapacity prekročili všetky limity a už nestíhame. Ak sa nám v najbližšej dobe nepodarí rozšíriť tím, bude nutné zo stránok

    … více »
    Ladislav Hagara | Komentářů: 17
    22.7. 12:00 | Nová verze

    PeerTube (Wikipedie), svobodná decentralizovaná platforma pro pro sdílení a přehrávání videí, byla vydána ve verzi 3.3. Z novinek lze zmínit možnost snadné úpravy úvodní stránky, vyhledávání v seznamech videí nebo kratší odkazy na videa.

    Ladislav Hagara | Komentářů: 28
    22.7. 09:00 | Komunita

    Vývojáři svobodného (GPLv3) šachového enginu Stockfish (Wikipedie) na svém blogu informují, že podali žalobu na společnost ChessBase (Wikipedie): ChessBase prodává šachový engine Fat Fritz 2 vycházející z enginu Stockfish a své uživatele neinformuje o GPL licenci a neposkytuje jim zdrojové kódy.

    Ladislav Hagara | Komentářů: 12
    22.7. 08:00 | Komunita

    Alyssa Rosenzweig se v příspěvku na blogu společnosti Collabora věnuje reverznímu inženýrství GPU Mali G78 s mikroarchitekturou a instrukční sadou Valhall. Po měsíci práce byla vydána referenční instrukční sada (pdf).

    Ladislav Hagara | Komentářů: 2
    22.7. 07:00 | Zajímavý software

    LiveKit je nedávno uvolněna open source platforma pro realtimovou komunikaci. Zdrojové kódy jsou k dispozici na GitHubu.

    Ladislav Hagara | Komentářů: 0
    21.7. 13:11 | Nová verze

    Po čtyřech měsících vývoje od vydání verze 5.7 byla vydána nová verze 5.8 svobodného open source redakčního systému WordPress. Kódové označení Tatum bylo vybráno na počest amerického jazzového klavíristy Arta Tatuma (Yesterdays).

    Ladislav Hagara | Komentářů: 25
    21.7. 08:00 | Bezpečnostní upozornění

    Společnost Qualys zveřejnila na svém blogu informace o v upstreamu již opravených bezpečnostních chybách CVE-2021-33909 v Linuxu (txt) a CVE-2021-33910 v systemd (txt). Chyba v Linuxu (fs/seq_file.c) je zneužitelná k lokální eskalaci práv.

    Ladislav Hagara | Komentářů: 7
    Preferuji
     (62%)
     (28%)
     (10%)
    Celkem 317 hlasů
     Komentářů: 60, poslední dnes 03:43
    Rozcestník

    Dotaz: Ako zavolať metódu triedy cez Template parameter?

    27.6. 23:38 hermes | skóre: 3 | blog: ASDFGH
    Ako zavolať metódu triedy cez Template parameter?
    Přečteno: 432×
    Ahojte snažím sa zavolať metódu tiredy cez template parameter, inej metódy, toto čo tu uvádzam je len príklad nie skutočný Controller aj keď v reále robím wrapper nad jednu HTTPServer libku. A niečo podobné tam používam. Toto sa mi dá skompilovať:
    class Request {}; class Response {};
    
    class Controller
    {
    public:
    	void BeforeAction(Request request, Response response)
    	{
    		std::cout << "BeforeAction" << std::endl;
    	}
    
    	template<typename C, typename void(C::* Action)(Request request, Response response)>
    	void CallAction(
    		Request request,
    		Response response
    	)
    	{
    		this->BeforeAction(request, response);
    		(static_cast<C*>(this)->*Action)(request, response);
    	}
    };
    
    class HomeController : public Controller
    {
    public:
    	void HandleIndex(
    		Request request,
    		Response response
    	)
    	{
    		std::cout << "HandleIndex" << std::endl;
    	}
    };
    auto controller = HomeController();
    auto request = Request();
    auto response = Response();
    controller.CallAction<HomeController, &HomeController::HandleIndex>(request, response);
    
    Ale chcel by som to ešte trošku "učesať" chcel by som aby som nemusel uvádzať ten prvý template parameter v CallAction action metóde (názov triedy). Teda buď aby som ho nemusel vôbec uvádzať, alebo aby sa odvodil nejako pomocou type inference. Viete mi prosím poradiť ako na to? Zdá sa mi zbytočne uvádzať ho 2x porušuje to princíp DRY.

    Řešení dotazu:


    Odpovědi

    Řešení 2× (Вherzet, Jеdna)
    27.6. 23:39 hermes | skóre: 3 | blog: ASDFGH
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?
    Joo a ešte som zabudol napísať, že ide o jazyk C++.
    Gréta avatar 28.6. 11:49 Gréta | skóre: 32 | blog: Grétin blogísek | Stockholm
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?

    proč prostě jakoby nepoužiješ polymorfizmuz?? :O :O stejně asi jako všecky ty voběkty musej mit to action by to fungovalo takže asi dědit z jednoho předka společnýho :O :O

    v každým afroamerickým otvoru kterej se zhroutí mužou bejt skovaný semínka uplně novýho vesmíru hele 🕳 🕳
    29.6. 23:23 hermes | skóre: 3 | blog: ASDFGH
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?
    Ahoj Controller je len bázová trieda, predok všetkých Controllerov od ktorej dedím ostatné custom Controlley.

    Akcie definujem až v potomkoch. Nemôžem ju definovať už v triede Controller, ako virtuálnu metódu a potom ju overridnúť v potomkovi, keďže vopred neviem aký názov Akcií zvolím v potomkovi a akcie môžu mať praktiocky ľubovolný názov.

    Príklad: môžem mať

    HomeController s názvom akcií
    • HandleIndex pre route pattern /home/index
    • HandleAbout pre route pattern /home/about
    ArticleController s Akciami:
    • HandleShow pre pattern /article/show/:articleUri
    • HandleEdit pre pattern /article/edit/:articleUri
    • HandleDelete pre pattern /article/delete/:articleUri
    BeforeAction môžem definovať už v tirede Controller a potom ho overridnúť, keďže to je univerzálna pomocná metóda, ktorá má už vopred daný názov a tá sa zavolá pred zavolaním akejkoľvek akcie. Môžem si v nej nadefinovať napr. spoločné HTTP hlavičky pre všetky akcie. Aby som ich nemusel definovať v každej akcii zvlášť.
    Gréta avatar 1.7. 12:31 Gréta | skóre: 32 | blog: Grétin blogísek | Stockholm
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?

    keďže vopred neviem aký názov Akcií zvolím v potomkovi a akcie môžu mať praktiocky ľubovolný názov

    jestli jako všecky berou jako argumenty 'request' a 'response' anic víc nic míň by nato šlo možná jít přez function pointery který by byly strkaný jako argument do tý metody 'CallAction' :O :O

    jak se jako zbavit toho datovýho typu v šabloně navíc zatim nevim :D toje moc velikakakakánská c++ magie ukazatele na metody nastrkaný do šablony :D :D

    v každým afroamerickým otvoru kterej se zhroutí mužou bejt skovaný semínka uplně novýho vesmíru hele 🕳 🕳
    Řešení 1× (Gréta)
    2.7. 00:24 Jardík
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?
    
    class Request {}; class Response {};
     
    class Controller
    {
    public:
        void BeforeAction(Request request, Response response)
        {
            std::cout << "BeforeAction" << std::endl;
        }
    
        
        template<typename C>
        void CallAction(
            void(C::*func)(Request, Response),
            Request request,
            Response response
        )
        {
            this->BeforeAction(request, response);
            (static_cast<C*>(this)->*func)(request, response);
        }
        
    };
     
    class HomeController : public Controller
    {
    public:
        void HandleIndex(
            Request request,
            Response response
        )
        {
            std::cout << "HandleIndex" << std::endl;
        }
    };
    
    int main()
    {
        auto controller = HomeController();
        auto request = Request();
        auto response = Response();
        controller.CallAction(&HomeController::HandleIndex, request, response);
    }
    
    
    Gréta avatar 4.7. 10:53 Gréta | skóre: 32 | blog: Grétin blogísek | Stockholm
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?

    nemaj se function pointery jakoby teďko dělat se std::function hele?? :O :O

    v každým afroamerickým otvoru kterej se zhroutí mužou bejt skovaný semínka uplně novýho vesmíru hele 🕳 🕳
    4.7. 11:43 Jardík
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?
    Záleží, co od toho čekáš (syntaxe, použití) a/nebo jak moc je/není potřeba (mikro)optimalizovat :-) Pokud by třeba metoda CallAction přebírala std::function<void(Request, Response)>, tak buď bude v místě volání jako parametr hnusný std::bind(&HomeController::HandleIndex, controller, std::placeholders::_1, std::placeholders::_2) (který zároveň často likviduje optimalizace), nebo tam bude lambda [&](Request req, Response res){controller.HandleIndex(std::move(req), std::move(res));}.

    Member function pointer mi zde přijde jako asi přehlednější řešení podle požadavku autora dotazu. Codegen vypadá nejlepší s původním řešením autora ... https://godbolt.org/z/nYbGfoPrW (vlevo řešení s předáním member function jako parametru, uprostřed member function jako template parameter, vpravo předání přes std::function). Osobně jsem čekal, že codegen 1. a 2. bude stejný, že to kompilátor zoptimalizuje, ale asi se mu to moc nedaří ...
    6.7. 00:18 hermes | skóre: 3 | blog: ASDFGH
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?
    hej std::function by to v tomto prípade celé komplikoval.
    Gréta avatar 6.7. 11:52 Gréta | skóre: 32 | blog: Grétin blogísek | Stockholm
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?

    díky :D ;D

    v každým afroamerickým otvoru kterej se zhroutí mužou bejt skovaný semínka uplně novýho vesmíru hele 🕳 🕳
    6.7. 00:15 hermes | skóre: 3 | blog: ASDFGH
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?
    Ahoj ďakujem za zjednodušenie :) funguje to
    Gréta avatar 1.7. 12:23 Gréta | skóre: 32 | blog: Grétin blogísek | Stockholm
    Rozbalit Rozbalit vše Re: Ako zavolať metódu triedy cez Template parameter?

    Toto sa mi dá skompilovať:

    btw by se mi to zkompilovalo v g++ 10 sem musela přepsat jedenáctej řádek na

    template<class C, void(C::* Action)(Request, Response)>

    v každým afroamerickým otvoru kterej se zhroutí mužou bejt skovaný semínka uplně novýho vesmíru hele 🕳 🕳

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.