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 03:55 | IT novinky

    Společnost Valve publikovala na svém GitLabu nákresy a schémata zapojení headsetu Steam Frame. Pro nekomerční účely.

    Ladislav Hagara | Komentářů: 0
    včera 23:11 | Bezpečnostní upozornění

    Soutěž Pwn2Own Ireland 2026 skončila 9. října. Bezpečnostní výzkumníci získali celkem 1 262 000 dolarů na odměnách. Během soutěže bylo předvedeno zneužití 98 zero-day zranitelností. Testování zahrnovalo různé kategorie zařízení a software. Výzkumníci předváděli prakticky fungující útoky podle pravidel soutěže. Výsledky následně slouží výrobcům při přípravě oprav. Mezi pokořenými jsou: Samsung Galaxy S26, OpenAI Codex, Oracle Autonomous AI Database, Google Pixel 10, u iPhone 17 neuspěli.

    vencour | Komentářů: 0
    9.10. 22:44 | Nová verze

    Programovací jazyk Python byl vydán v nové verzi 3.15.0. Podrobný přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 6
    9.10. 22:33 | Zajímavý projekt

    BIGWORDS.PAGE je open-source webová aplikace, která po otevření odkazu v prohlížeči vykreslí přes celou obrazovku jednoduché informační sdělení. Zpráva i její nastavení jsou uložené v části URL za znakem #, například odkaz https://bigwords.page/#abclinuxu zobrazí jako velký bílý nápis 'abclinuxu' na černém pozadí. Obsah odkazu lze upravovat i vestavěným editorem, ten umožňuje nastavovat formátování a vizuální efekty textu, časovače, QR kódy a obrázky. Zdrojový kód je dostupný pod licencí MIT na GitHubu.

    ❗Červivý Hřib krade❗ | Komentářů: 8
    9.10. 11:55 | Upozornění

    V neděli 11. října proběhne rotace klíče kořenové zóny. Podruhé v historii. Ondřej Filip na blogu CZ.NIC: "Pokud je pro Vás DNS protokol spíše výzva, ale přesto spravujete nějakou síť či DNS resolver, zkuste si jednoduchý test, který připravila firma Cloudflare na této adrese. Obzvláště zbystřit byste měli, pokud uvidíte nějaká červená políčka."

    Ladislav Hagara | Komentářů: 14
    9.10. 09:55 | IT novinky

    Vláda Spojených států se rozhodla vyřadit americkou softwarovou společnost Microsoft a několik dalších velkých technologických podniků z programu, který umožňuje kvalifikovaným zahraničním pracovníkům získat povolení k trvalému pobytu. Oznámila to včera administrativa amerického prezidenta Donalda Trumpa. Opatření zdůvodnila rozsáhlým zneužíváním programu, který je dlouhodobě terčem kritiky ze strany Trumpových příznivců, neboť prý znevýhodňuje americké pracovníky.

    Ladislav Hagara | Komentářů: 11
    9.10. 09:44 | IT novinky

    Datové centrum největší ruské technologické společnosti Jandex v Rjazaňské oblasti se stalo cílem dronového útoku a zastavilo provoz. Jandexu se někdy přezdívá „ruský Google“. Provozuje nejoblíbenější internetový vyhledávač v Rusku nebo aplikace pro objednávky jídla a taxi. Využívají jej desítky milionů lidí v rusky mluvících zemích.

    Ladislav Hagara | Komentářů: 12
    9.10. 09:33 | Nová verze

    Francouzská společnost Mistral AI představila Mistral Large 4 (interně přezdívaný 'le Chonk', volně přeloženo 'pořádný macek'), 'open-weight multimodální hybridní instruct-and-reasoning model s architekturou granulárního MoE, nativně podporující více jak 160 jazyků'. Model má přes jeden bilión parametrů, z nichž při práci využívá 49 miliard, kontextové okno o délce milion tokenů a obrazový enkodér o 1,6 miliardách parametrů.

    … více »
    ❗Červivý Hřib krade❗ | Komentářů: 2
    9.10. 03:22 | Nová verze

    Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.20. Díky 227 přispěvatelům.

    Ladislav Hagara | Komentářů: 0
    9.10. 03:11 | Komunita

    Simon Long oznámil Raspberry Pi Desktop pro PC a Mac s Intelem postavený na aktualizovaném Debianu 13 Trixie. S klientem Raspberry Pi Connect pro vzdálenou správu. Ke stažení je vedle Raspberry Pi OS pro Raspberry Pi.

    Ladislav Hagara | Komentářů: 1
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (21%)
     (29%)
     (8%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2828 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    Rozcestník

    Dotaz: C++ ako na šablóny?

    8.10.2020 02:25 Naples
    C++ ako na šablóny?
    Přečteno: 899×
    Dobrý deň. Na úvod len spomeniem, že s templatami v C++ nemám žiadne skúsenosti, takže som si musel pomôcť googlením. Vyzerá to trošku ako generiká, akurát tie možnosti templatov sú úplne inde.

    Potreboval by som si spraviť šablónu, ktorá povoluje ako "generický" parameter len stringové typy. Teda všetky typy ktoré sú odvodené od std::basic_string (napr. std::string, std::wstring, std::u8string, ...)

    Tu je trait (ktorý som si vygooglil):
    #include <type_traits> 
    
    template<class T>
    struct is_basic_string : std::false_type{};
    
    template<class Ch, class Tr, class Al>
    struct is_basic_string<std::basic_string<Ch, Tr, Al>> : std::true_type{};
    
    Mám takúto šablónu, ktorá konvertuje nejaký kontainer znakov na stringy:
    template<typename T = std::string>
    T toString(const binaries& bins)
    {
          static_assert(is_basic_string<T>::value, __FUNCTION__ "<T>: The parameter T can only be derived from std::basic_string");
          return T(bins.begin(), bins.end());
    }
    prvý riadok tela funkcie je kontrola či má parameter srpávny typ (či je odvodený od basic_string, inak povedané či je parameter jeden zo stringových typov). V opačnom prípade prekladač vyhodí chybu. Chybová hláška obsahuje makro __FUNCTION__ zobrazujúce názov aktálnej funkcie. Mno, ale keďže ten prvý riadok, ktorý kontroluje typ string sa mi bude hodiť aj inde (všade kde potrebujem overiť či template parameter je string) rozhodol som sa že z neho urobím tiež trait. Takže upravený kód vyuzerá takto:
    template<typename T>
    struct ensure_is_basic_string
    {
    	static_assert(is_basic_string<T>::value, "<T>: The parameter T can only be derived from std::basic_string");
    };
    
    template<typename T = std::string>
    static T toString(const binaries& bins)
    {
    	ensure_is_basic_string<T>;
    	return T(bins.begin(), bins.end());
    }
    Asi ste si všimli, že mi tam chýba makro __FUNCTION__ vracajúce názov aktuálnej funkcie, keďže sme kód premiestnili do traitu. Otázka je akým spôsobom tam mám vložiť názov aktuálnej funkcie? Pridať stringový parameter?

    Řešení dotazu:


    Odpovědi

    8.10.2020 10:39 MadCatX
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    Ten struct nahraď makrem a máš vyřešeno. __FUNCTION__ se ve static_assertu stejně použít nedá, protože to není znakový literál. Kompilátor ti řekne přesně, kde překlad selhal, takže informaci o aktuální funkci v té chybové hlášce není potřebná.
    8.10.2020 19:52 Naples
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    Ďakujem toto ma ani nenapadlo. A nepoznáš ešte nejaký iný spôsob? Lebo v tomto prípade to prerobím na makro, ale pre niektoré use cases sa makro nehodí.
    8.10.2020 22:10 MadCatX | skóre: 28 | blog: dev_urandom
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    A kdy nemůžeš ten static_assert obalit makrem?
    9.10.2020 01:52 Naples
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    Popravde neviem. Možno taký prípad nemôže nastať. V C++ som začiatočník a zatiaľ nepoznám potenciál ani šablón, ani makier a už vôbec ich kombinácií, akurát vidím, že je to mocná zbraň.

    Z teórie viem že šablóny majú výhodu v tom, že sú typovo bezpečné, pretože ich overuje priamo prekladač C++, naproti tomu s makrami pracuje preprocessor, ktorý "nepozná" C++ typy. A keďže sa učím C++ (a v čistom C som nikdy neprogramoval) snažil som sa doteraz prefereovať (nové) C++ konštrukcie. Ale vďaka Vášmu tipu vidím, že môžu nastať prípady, kedy je vhodné použiť makro, alebo kombináciu šablón a makier. "Funkcionálne" makro som dnes definoval vôbec prvý krát.

    Ale keď už sme pri šablónach, mal by som ešte jednu otázku. Neviem či mi ju budete vedieť zodpovedať, ale aspoň skúsim:

    mám definované 2 typové aliasy. Jeden je na ukladanie binárnych dát. A druhý je niečo podobné akurát pracuje s multibyteovým charom (do toho prvého sa dá uložiť všetko, druhý je len taký helper):
    typedef std::vector<unsigned char> binaries;
    typedef std::vector<wchar_t> wbinaries;
    a k tomu mám template:
    template<typename T>
    static std::vector<T> toQuoted(const std::vector<T>& v)
    {
          //nejaký kód
          return bins;
    }
    
    Tento template podporuje hociaký vector. Lenže ja by som rád typy na vstupe obmedzil len na 2 typy a to binaries a wbinaries. Neskôr možno pridám aj ďaľšie. Napadlo ma testovať to zatiaľ takto:
    template<typename T>
    static std::vector<T> toQuoted(const std::vector<T>& v)
    {
          static_assert(std::is_same_v(T, unsigned char) || std::is_same_v(T, wchar_t), __FUNCTION__ ": The parameter was expected to have type binaries or wbinaries");
          ...
          return bins;
    }
    
    Lenže to sa mi vôbec nepáči, lebo ja už mám hotové makro, ktoré netestuje parameter vektoru, ale priamo celý typový alias aj s parametrom.
    #define requires_binaries(T) \
          static_assert(std::is_same_v(T, binaries) || std::is_same_v(T, wbinaries), __FUNCTION__ ": The parameter was expected to have type binaries or wbinaries");
    A použiť som ho chcel takto:
    template<typename T>
    static std::vector<T> toQuoted(const std::vector<T>& v)
    {
          requires_binaries(std::vector<T>)
          ...
          return bins;
    }
    
    Akurát std::is_same_v si s vektorom neporadí a akceptuje len std::is_same_v<T, binaries> ale už nie std::is_same_v<std::vector<T>, binaries>

    Prekladač: 'std::is_same_v': use of a variable template requires template argument list

    Nepoznáte spôsob ako odtestovať "celý" typ aj s generickým parametrom?
    9.10.2020 11:27 MadCatX | skóre: 28 | blog: dev_urandom
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    Pokud máš funkci, která má pracovat jen s dvěma konkrétními datovými typy, neřešil bych to šablonami ale specializací těch funkcí. Šablony se používají v situacích, kdy je rozsah typů, se kterými může nějaký kus kódu pracovat dost široký a nanejvýš chceš vyloučit pár případů.

    Ta tvoje situace by se dala šablonami jakž-takž vyřešit třeba takto:
    #include <list>
    #include <vector>
    
    template <typename T>
    struct assert_vector_type {
            template <typename V> static const bool value = std::is_same<V, void>::value;
    };
    
    template <typename T, typename U>
    struct assert_vector_type<std::vector<T, U>> {
            template <typename V> static const bool value = std::is_same<T, V>::value;
    };
    
    #define assert_is_binaries(v) \
            static_assert(assert_vector_type<std::decay_t<decltype(v)>>::template value<wchar_t> || \
                          assert_vector_type<std::decay_t<decltype(v)>>::template value<unsigned char>, \
                          "Type mismatch");
    
    template <template <typename...> class T, typename ...Args>
    T<Args...> toQuoted(const T<Args...>& v)
    {
            assert_is_binaries(v);
            return T<Args...>();
    }
    
    int main()
    {
            std::list<unsigned char> l;
            std::vector<int> a;
            std::vector<unsigned char> b;
            std::vector<wchar_t> c;
    
            //toQuoted(a);
            toQuoted(b);
            toQuoted(c);
            //toQuoted(l);
    
            return 0;
    }
    
    ale je to dost ujeté a prakticky by to tak nejspíš nikdo nedělal.
    9.10.2020 19:44 Naples
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    Ak by to bola nejaká malá funkcia tak máte pravdu. Ale už tu by som mal 2 rovnaké funcie, ktoré by sa líšili len v tom, že by pracovali s iným typom a každú malú zmenu by som musel editovať 2x. A porušoval by som tým princíp dry.

    Ale poďme ďalej. Ak tých funkcií budem mať v libke 20 tak každú budem musieť spraviť 2x? To je potom copy-paste programovanie. A keby som chcel pridať tretí typ tak (napr. v C++ 20 pribudla podpora UTF-8):
    //nahrada za std::u8string ktorá môže obsahovať všetky znaky (vrátane '\0')
    typedef std::vector<char8_t> u8binaries;
    
    Tak by som musel robiť 20x copy paste pre wbinaries a 20x pre u8binaries. Ja sa snažím minimalizovať kopírovanie rovnakého kódu (v prípade že to má zmysel).

    A ten Váš príklad idem vyskúšať, ďakujem Vám :)
    10.10.2020 01:32 MadCatX | skóre: 28 | blog: dev_urandom
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    V takovém případě úplně stačí kontrola toho šablonového typu. U funkce jako
    template <typename T>
    std::vector<T> f(const std::vector<T> &v) {
        static_assert(std::is_same_v<T, char> || std::is_same_v<T, wchar_t>, "Type mismatch");
    
        return ret;
    }
    
    je kontrola na celý std::vector<T> zbytečná, protože nic jiného než std::vector tam stejně nepředáš. Pokud máš funkci, která dostává a vrací ten samý kontejner, zvážil bych použití std::transform.
    10.10.2020 14:53 Naples
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    Hej to je jedna z možností ktorú som spomenul v príklade v príspevku "včera 01:52" lenže má to nevýhodu že sa nemôžem dotazovať na konkrétny typ ale na jeho parameter a keď mám makro ktoré testuje celý typ tak musím mať aj iné makro ktoré testuje ten parameter.

    10.10.2020 16:10 MadCatX | skóre: 28 | blog: dev_urandom
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    To jo, ale pokud do funkce předáváš parametr typu std::vector<T>, proč je potřeba testovat, že předaný parametr je typu std::vector<T>, když do té funkce nic jiného předat nelze? Test na parametr T je naprosto dostačující a funkční.
    14.10.2020 15:43 10minuteman
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    "Otázka je akým spôsobom tam mám vložiť názov aktuálnej funkcie?"

    Pokud mas dostatecne moderni compiler, muzes zkusit pouzit source_location header.
    17.10.2020 14:03 Ondra Holub | skóre: 6
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    Třeba nějak takto:
    template< typename CH, typename TRAITS, typename ALLOC>
    void moje_funkce(std::basic_string< CH, TRAITS, ALLOC>& prm)
    {
    }
    
    Nebo případně:
    template< typename ARGS...>
    void moje_funkce(std::basic_string< ARGS...>& prm)
    {
    }
    
    20.10.2020 19:50 Franta
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    Proč to dělat jednoduše, když to jde složitě s použitím miliónu traitů, že? To je dnešní mentalita... Zasloužíte si pochvalu za jednoduché řešení.
    21.10.2020 12:36 MadCatX | skóre: 28 | blog: dev_urandom
    Rozbalit Rozbalit vše Re: C++ ako na šablóny?
    To jistě, až na to, že tazatel se ptal na něco docela jiného.

    Založit nové vlákno • Nahoru

    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.