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í
×
    včera 23:33 | Zajímavý článek

    Na stránkách Syst3m Failure byl publikován článek o využití 16leté bezpečnostní chyby CVE-2021-42008 v Linuxu v ovladači 6pack k získání roota. Chyba byla do Linuxu zanesena v roce 2005 a v upstreamu opravena letos v létě.

    Ladislav Hagara | Komentářů: 1
    včera 19:00 | Nová verze

    Byl vydán Blender 3.0. Oznámení vydání obsahuje vizualizace změn. Plány pro vydání byly shrnuty v dřívějším zápisku.

    Fluttershy, yay! | Komentářů: 0
    včera 16:44 | Nová verze

    Představen byl CentOS Stream 9. Jedná se o průběžně aktualizovanou linuxovou distribuci umístěnou mezi Fedora Linuxem a Red Hat Enterprise Linuxem (RHEL). Podpora CentOS Linuxu 8 končí s koncem letošního roku.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Nová verze

    Byla vydána nová major verze 3.0.0 knihovny Notcurses pro vývoj programů s vylepšeným textovým uživatelským rozhraním (TUI). Ukázka možností na YouTube. Více o knihovně v knize Hacking The Planet! with Notcurses (pdf).

    Ladislav Hagara | Komentářů: 0
    včera 13:00 | Nová verze

    V červenci letošního roku byl představen 3D open source herní a simulační engine Open 3D Engine (O3DE). Včera byla vydána první major verze 21.11. Z novinek lze zdůraznit podporu Linuxu.

    Ladislav Hagara | Komentářů: 0
    včera 09:00 | Komunita

    Nedávno byl vydán nový Raspberry Pi OS založený na Debianu 11 Bullseye. Řadě uživatelů ale novinky nevyhovují, viz například problém s kamerami. Vývojáři se proto rozhodli vedle Raspberry Pi OS podporovat také Raspberry Pi OS (Legacy) založený na Debianu 10 Buster. Uživatelé požadující knihovnu picamera mohou nově používat také Raspberry Pi OS a knihovnu si povolit v nastavení raspi-config (YouTube).

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

    Byla vydána verze 1.7.0 dynamického programovacího jazyka Julia (Wikipedie) určeného zejména pro vědecké výpočty. Přehled novinek v příspěvku na blogu a v poznámkách k vydání. Aktualizována byla také dokumentace. Současně bylo oznámeno, že větev 1.6 (aktuálně verze 1.6.4) je nově LTS.

    Ladislav Hagara | Komentářů: 0
    včera 07:00 | Nová verze Ladislav Hagara | Komentářů: 0
    2.12. 21:22 | Nová verze

    Byla vydána nová verze 6 integrovaného vývojového prostředí (IDE) Qt Creator. Podrobný přehled novinek v cgitu. Zdůraznit lze podporu vícekurzorové editace (gif).

    Ladislav Hagara | Komentářů: 3
    2.12. 20:55 | Nová verze

    Byla vydána verze 1.57.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    Pracujete z domu?
     (34%)
     (29%)
     (18%)
     (0%)
     (19%)
     (1%)
    Celkem 80 hlasů
     Komentářů: 13, poslední včera 19:58
    Rozcestník



    Dotaz: [c++2a] Aggregate initialization

    4.10. 17:47 hermes | skóre: 4 | blog: ASDFGH | BA
    [c++2a] Aggregate initialization
    Přečteno: 402×
    Ahojte, občas používam anemické objekty (alebo čo to je) ako prepravky... (Napríklad keď si robím restové API a deserializujem JSONy, ktoré potom ukladám do DB.) Problém je, že C++ štandard je veľmi striktný, atribúty musím pri inicializácii zadať v rovnakom poradí, ako som ich deklaroval v triede a nemôžem ich vynechať. Prečo to tak je? A dá sa to nejako obísť? Nejakým parametrom compilera (GCC), alebo nejakým iným zápisom? Niečo sa mi marí, že v čistom (novom) C som raz videl aj iný spôsob zápisu (tuším každá propsa spolu s hodnotou bola obalená ešte v jednom páre zložených zátvoriek), ale ten v C++ nefunguje. Má to teda nejaké riešenie?
    struct Entity
    {
        int prop1;
        int prop2;
        int prop3;
    };
    
    auto entity = Entity{ .prop1 = 1, .prop2 = 2, .prop3 = 3 };

    Řešení dotazu:


    Odpovědi

    Řešení 1× (Bhezret)
    4.10. 18:23 Andrej | skóre: 49 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization

    Možná to chce udělat krok zpátky a podrobněji popsat, jaký problém řešíš, a zejména proč je pro řešení toho problému tak důležité proměnlivé pořadí členů ve třídě a proč se nedá najít v C++ taková reprezentace, která to pořadí bude mít „správně“.

    Nedá se zkrátka pořadí členů permutovat tak, aby mu obvyklý způsob inicializace odpovídal?

    Pokud to nejde a někteří členové nemusí být k dispozici, dá se použít std::optional (pro přímé zapouzdření) nebo std::unique_ptr (pro „zapouzdření“ à la Java)?

    Pokud se pořadí některých členů musí fakt libovolně náhodně lišit (proč?), pomohl by třeba std::variant nebo dynamický kontejner nebo kombinace obojího?

    Nedá se to rozdělit na víc různých typů? Nepomohla by dědičnost a mít to, co je vždy k dispozici, ve společném rodiči? (Což je opět stejná otázka jako „je možná permutace taková, že…“.)

    4.10. 23:31 hermes | skóre: 4 | blog: ASDFGH | BA
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization
    Prečo to potrebujem? Je za tým viac dôvodov. Občas to pomôže sprehľadniť kód. V iných jazykoch sú plain objekty mocná zbraň... V JS / TSku sa dajú plain objecty používajú napríklad ako náhrada za pomenované parametre. Ale je za tým aj to vynechávanie. Keby to bolo o niečo málo flexibilnejšie, malo by to viac use cases.
    5.10. 03:14 Andrej | skóre: 49 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization

    Pokud to má být extrémní flexibilita bez ohledu na efektivitu, třeba je to případ pro std::unordered_map<std::string, std::variant<Spousta, Různých, Variant, ...>>. I když, pro ještě větší podobnost JavaScriptu by ten klíč měl být asi std::variant<Nějaké, Skalární, Typy, ...> místo std::string.

    Jenže: Proč dělat z C++ JavaScript? Určitě se ten nápad dá v C++ vyjádřit líp a „idiomaticky“. Pokud ne, třeba je lepší to nechat v JavaScriptu.

    Gréta avatar 4.10. 21:27 Gréta | skóre: 34 | blog: Grétin blogísek | Stockholm
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization

    co jakoby takle uplně jednoduše :D

    struct Entity
    {
        int a, b, c;
    };
    
    int main()
    {
        
        Entity hermes;
        hermes.c=1;
        hermes.b=2;
        hermes.a=3;
        
        return 0;
    }
    
    4.10. 23:32 hermes | skóre: 4 | blog: ASDFGH | BA
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization
    No len nevýhoda je, že to už neni inicializácia, ale priraďovanie, veľakrát je to skoro jedno, ale keby tam bol napr. const tak by to nefungovalo. Okrem toho v niektorých situáciách sa snažím preferovať immutablitu a teda inicializáciu pred priraďovaním.
    5.10. 03:03 Andrej | skóre: 49 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization

    Ale const tam můžeš mít taky, kdybys setsakra moc chtěl. Stačí, aby ta třída měla (implicitně nebo explicitně) &&-konstruktor.

    const Entity hermes{[] {
      Entity result;
      result.c = 1;
      result.b = 2;
      result.a = 3;
      return result;
    }()};
    

    Jenom bych se vsadil, že se ty typy dají uspořádat (a spořádaně konstruktory inicializovat) mnohem líp než takhle.

    5.10. 03:06 Andrej | skóre: 49 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization

    Mám ještě dojem, že kolem toho volání lambdy musí být extra závorky nebo tak něco. Kompilátor napoví. Ale to už jsou jenom technikálie (vzor: fekálie); princip zůstává.

    Řešení 1× (Gréta)
    5.10. 09:45 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization
    atribúty musím pri inicializácii zadať v rovnakom poradí, ako som ich deklaroval v triede a nemôžem ich vynechať

    g++ od verze 8 sice trvá na zachování pořadí, ale už lze inicializátory vynechávat (příslušný člen je pak null initialized jako v C).

    Niečo sa mi marí, že v čistom (novom) C som raz videl aj iný spôsob zápisu (tuším každá propsa spolu s hodnotou bola obalená ešte v jednom páre zložených zátvoriek)

    Nic tak komplikovaného, prostě jen místo anonymních inicializátorů použijete pojmenované. Funguje to už od C90:

    #include <stdio.h>
    
    struct entity {
            int     prop1;
            int     prop2;
            int     prop3;
    };
    
    int main()
    {
            struct entity e = {
                    .prop3  = 3,
                    .prop1  = 1,
            };
    
            printf("prop1=%d, prop2=%d, prop3=%d\n", e.prop1, e.prop2, e.prop3);
    
            return 0;
    }
    
    mike@lion:/tmp/test> gcc-12 --std=c90 -Wall -Wextra -o x x.c
    mike@lion:/tmp/test> ./x
    prop1=1, prop2=0, prop3=3
    

    Třicet let standardizovaná featura mi nepřijde až tak horká novinka. :-)

    5.10. 09:59 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization
    Vnořené složené závorky jste možná mohl vidět, pokud se inicializovalo např. pole struktur nebo vnořené struktury.
    6.10. 10:41 luky
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization
    Prekladejte to C prekladacem a prilinkujte si to k C++ aplikaci.
    6.10. 20:41 Jardík
    Rozbalit Rozbalit vše Re: [c++2a] Aggregate initialization
    Tady např. vysvětlují důvod.

    Podělaný semafory.

    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.