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 04:55 | Nová verze

    Byla vydána verze 4.0 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Přehled novinek v poznámkách k vydání. Využíván je Free Pascal Compiler (FPC) 3.2.2.

    Ladislav Hagara | Komentářů: 0
    dnes 00:33 | Komunita

    Podpora Windows 10 končí 14. října 2025. Připravovaná kampaň Konec desítek (End of 10) může uživatelům pomoci s přechodem na Linux.

    Ladislav Hagara | Komentářů: 4
    včera 23:22 | Pozvánky

    Již tuto středu proběhne 50. Virtuální Bastlírna, tedy dle římského číslování L. Bude L značit velikost, tedy více diskutujících než obvykle, či délku, neboť díky svátku lze diskutovat dlouho do noci? Bude i příští Virtuální Bastlírna virtuální nebo reálná? Nejen to se dozvíte, když dorazíte na diskuzní večer o elektronice, softwaru, ale technice obecně, který si můžete představit jako virtuální posezení u piva spojené s učenou

    … více »
    bkralik | Komentářů: 0
    včera 22:33 | IT novinky

    Dle plánu dnes končí služba Skype. Uživatelé mohou pokračovat v Microsoft Teams.

    Ladislav Hagara | Komentářů: 0
    včera 21:44 | IT novinky

    Český statistický úřad rozšiřuje Statistický geoportál o Datový portál GIS s otevřenými geografickými daty. Ten umožňuje stahování datových sad podle potřeb uživatelů i jejich prohlížení v mapě a přináší nové možnosti v oblasti analýzy a využití statistických dat.

    Ladislav Hagara | Komentářů: 1
    včera 12:33 | Zajímavý projekt

    Kevin Lin zkouší využívat chytré brýle Mentra při hraní na piano. Vytváří aplikaci AugmentedChords, pomocí které si do brýlí posílá notový zápis (YouTube). Uvnitř brýlí běží AugmentOS (GitHub), tj. open source operační systém pro chytré brýle.

    Ladislav Hagara | Komentářů: 1
    včera 12:11 | Pozvánky

    Jarní konference EurOpen.cz 2025 proběhne 26. až 28. května v Brandýse nad Labem. Věnována je programovacím jazykům, vývoji softwaru a programovacím technikám.

    Ladislav Hagara | Komentářů: 0
    4.5. 21:44 | Komunita

    Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.

    Ladislav Hagara | Komentářů: 0
    4.5. 14:22 | IT novinky

    Před 25 lety zaplavil celý svět virus ILOVEYOU. Virus se šířil e-mailem, jenž nesl přílohu s názvem I Love You. Příjemci, zvědavému, kdo se do něj zamiloval, pak program spuštěný otevřením přílohy načetl z adresáře e-mailové adresy a na ně pak „milostný vzkaz“ poslal dál. Škody vznikaly jak zahlcením e-mailových serverů, tak i druhou činností viru, kterou bylo přemazání souborů uložených v napadeném počítači.

    Ladislav Hagara | Komentářů: 29
    3.5. 22:33 | Nová verze

    Byla vydána nová major verze 5.0.0 svobodného multiplatformního nástroje BleachBit (GitHub, Wikipedie) určeného především k efektivnímu čištění disku od nepotřebných souborů.

    Ladislav Hagara | Komentářů: 2
    Jaký filesystém primárně používáte?
     (58%)
     (1%)
     (8%)
     (21%)
     (4%)
     (2%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 526 hlasů
     Komentářů: 22, poslední včera 10:06
    Rozcestník

    Administrace komentářů

    Jste na stránce určené pro řešení chyb a problémů týkajících se diskusí a komentářů. Můžete zde našim administrátorům reportovat špatně zařazenou či duplicitní diskusi, vulgární či osočující příspěvek a podobně. Děkujeme vám za vaši pomoc, více očí více vidí, společně můžeme udržet vysokou kvalitu AbcLinuxu.cz.

    Příspěvek
    3.12.2020 19:07 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: C++ shared_ptr - constrainty

    Začal bych od jednoduchého příkladu — implicitní iterace po slovech. To se zařídí třeba takhle:

    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <string>
    
    namespace {
    
    template<typename C>
    struct ifstream_iterable {
      ifstream_iterable(const std::string &path) : stream_{path} {}
      auto begin() { return iterator{stream_}; }
      auto end() { return iterator{}; }
     private:
      typedef std::istream_iterator<std::basic_string<C>, C> iterator;
      std::basic_ifstream<C> stream_;
    };
    
    }  // namespace
    
    int main() {
      for (auto &w : ifstream_iterable<wchar_t>{"/proc/cpuinfo"})
        std::wcout << w << std::endl;
    }
    

    To bychom měli. Teď je otázka, jak z toho^^^ udělat iteraci po řádcích. Předně pár poznámek k tématu:

    • Tvůj příklad s operátorem >> je mírně špatně v mezích zákona, protože deklarace je hodně podobná této deklaraci v headeru <string>, což sice na první pohled nevadí, ale na druhý pohled tam hraje roli až příliš mnoho složitých detailů kolem pravidel pro hledání identifikátorů. Drobná změna standardu a/nebo (kni)hovny může vést k tomu, že operátor se buď vůbec nepoužije, nebo začne být v konfliktu s operátory z (kni)hovny. Drobnou modifikací se mi podařilo vyrobit (proti)příklad, kdy clang++ i g++ kód přeloží bez varování, ale g++ „přetížený“ operátor použije, zatímco clang++ nikoliv.
    • Jedno (nechvalně) známé řešení ze Zásobníkovéhopřetečení sice vypadá na první pohled hezky a jednoduše, ale vyskytují se v něm tři poněkud nepříjemné a sporné nápady:

      • soukromá dědičnost (která se tu a tam hodí, ale tenhle případ není ani tu, ani tam)
      • kámoši (kterým je ideální se vyhnout, protože všeho všudy ukazují na chybu v návrhu (zapouzdření atd.))
      • dědění od std::string (což je sice technicky možné, ale z hlediska kompatibility a udržovatelnosti kódu je vhodné se takových nápadů vyvarovat)

    Co tedy podniknout? Třeba tohle:

    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <string>
    #include <utility>
    
    namespace {
    
    template <typename C>
    struct line {
      std::basic_istream<C>& operator <<(std::basic_istream<C> &stream) {
        std::getline(stream, str_);
        return stream;
      }
      operator const std::basic_string<C>&() const & { return str_; }
      operator std::basic_string<C>&() & { return str_; }  // zde se nepoužije
      operator std::basic_string<C>() && { return std::move(str_); }  // -dtto-
     private:
      std::basic_string<C> str_;
    };
    
    template <typename C>
    std::basic_istream<C>& operator >>(std::basic_istream<C> &stream,
                                       line<C> &str) {
      str << stream;
      return stream;
    }
    
    template<typename C>
    struct ifstream_iterable {
      ifstream_iterable(const std::string &path) : stream_{path} {}
      auto begin() { return iterator{stream_}; }
      auto end() { return iterator{}; }
     private:
      typedef std::istream_iterator<line<C>, C> iterator;
      std::basic_ifstream<C> stream_;
    };
    
    }  // namespace
    
    int main() {
      for (const std::wstring &l : ifstream_iterable<wchar_t>{"/proc/cpuinfo"})
        std::wcout << l << std::endl;
    }
    

    Tohle^^^ nedědí od základních typů, nevyvolává příliš mnoho nespecifikovaných rohových případů, nepoužívá kámoše a vystačí si s jednou třídou (dělnickou), kterou lze konvertovat na odpovídající string. (Pro složitější konverze do jiného API si lze napsat deduction guides, ale to už je jiné téma. V této podobě se kód přeloží s C++ 14, 17 i 20, zatímco s deduction guides by vyžadoval minimálně C++17.)

    Ještě závěrem dodám (a předejdu tak, doufám, některým komentářům), že někteří lidé mají utkvělou špatnou představu o sousloví return std::move(...); — myslí si, že něco takového nedává smysl a že by to nemělo existovat. Samozřejmě se mýlí, jak jinak; tady jsou k tomu předdrobnosti i podrobnosti.

    V tomto formuláři můžete formulovat svou stížnost ohledně příspěvku. Nejprve vyberte typ akce, kterou navrhujete provést s diskusí či příspěvkem. Potom do textového pole napište důvody, proč by měli admini provést vaši žádost, problém nemusí být patrný na první pohled. Odkaz na příspěvek bude přidán automaticky.

    Vaše jméno
    Váš email
    Typ požadavku
    Slovní popis
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.