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 15:00 | Nová verze

Byla vydána nová stabilní verze 3.1 (3.1.0) svobodného multiplatformního softwaru pro editování a nahrávání zvukových souborů Audacity (Wikipedie). Přehled nových vlastností ve videu na YouTube a v aktualizované dokumentaci.

Ladislav Hagara | Komentářů: 0
dnes 12:00 | IT novinky

V listopadu 2015 bylo představeno pětidolarové Raspberry Pi Zero. V únoru 2017 desetidolarové Raspberry Pi Zero W s Wi-Fi a Bluetooth. Dnes bylo představeno vylepšené patnáctidolarové Raspberry Pi Zero 2 W.

Ladislav Hagara | Komentářů: 0
dnes 01:11 | Nová verze

Realtimová strategie Warzone 2100 (Wikipedie) byla vydána ve verzi 4.2.0. Podrobný přehled novinek, změn a oprav v ChangeLogu na GitHubu. Nejnovější verzi Warzone 2100 lze instalovat také ze Snapcraftu. Brzy i z Flathubu.

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

X Server (xorg-server) 21.1.0 byl oficiálně vydán. Mezi stěžejními novinkami je jmenována podpora např. proměnlivé obnovovací frekvence v modesetting, 2D akcelerace GLAMOR v Xvfb, gest touchpadu v XInput 2.4 nebo dokončení přechodu z Autotools na Meson. XWayland byl již dříve vydán samostatně.

Fluttershy, yay! | Komentářů: 10
26.10. 23:33 | IT novinky

Vývojáři komunikátoru Element, dříve Riot, představili Element One. Za 5 dolarů měsíčně propojí Matrix, WhatsApp, Signal a Telegram.

Ladislav Hagara | Komentářů: 24
26.10. 22:11 | Nová verze

Na konferenci Next.js Conf bylo oznámeno vydání nové verze 12 open source frameworku Next.js (Wikipedie) pro psaní webových aplikací v Reactu. Přehled novinek v příspěvku na blogu.

Ladislav Hagara | Komentářů: 4
26.10. 14:22 | Zajímavý software

Vývojáři open source emulátoru přenosné herní konzole Nintendo Switch Yuzu (Wikipedie) na svém blogu informují, že v nejnovějších sestaveních Yuzu je již k dispozici nejžádanější funkce Resolution Scaler aneb hry navržené pro rozlišení 720p/900p/1080p lze hrát v rozlišení 2K/4K/8K.

Ladislav Hagara | Komentářů: 2
26.10. 13:33 | Komunita

Nadace Raspberry Pi informuje, že ovladač V3DV pro Raspberry Pi 4 úspěšně prošel testy kompatibility s Vulkan 1.1 u Khronosu.

Ladislav Hagara | Komentářů: 0
26.10. 07:00 | Zajímavý projekt

PiBox je NAS postavený na Raspberry Pi Compute Module 4. Na Kickstarteru byla spuštěna kampaň na jeho podporu.

Ladislav Hagara | Komentářů: 21
25.10. 12:44 | Nová verze

Byla vydána třetí opravná verze 19.3 v únoru vydané verze 19.0 multimediálního centra Kodi (dříve XBMC, Wikipedie) s kódovým označením Matrix.

Ladislav Hagara | Komentářů: 6
Kolik monitorů (obrazovek) používáte současně?
 (48%)
 (37%)
 (14%)
 (1%)
Celkem 469 hlasů
 Komentářů: 29, poslední 19.10. 07:04
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: 385×
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: 33 | 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;
}
zapomeňte na lauru teďko máme matěje hele 🤪 🤪
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.