Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 30% výuky zdarma!
C# týden

Diskuze: C++ kopírovanie štruktúr (prípadne objektov) na štýl funkcionálnych jazykov

Aktivity (3)
Avatar
Developer123
Člen
Avatar
Developer123:7. ledna 20:42

Automatické kopírovanie celých structov a classov, s možnosťou inicializácie niektorých memberov.

Zkusil jsem: Skúšal som to riešiť cez designated initializers, ale nenašiel som žiadny elegantný spôsob ako na to.

Chci docílit: F# keďže je funkcionálny jazyk má rôzne imutable typy, medzi inými aj typ record. Typ record z F# je veľmi podobný ako struct z C++ alebo record z pascalu, akurát je to referenčný typ (pomocou atribútu https://fsharp.github.io/…tribute.html môže byť record interne reprezentovaný aj ako hodnotový typ.

Výhoda recordov je že sú implicitne immutable (ak pri recorde nikde nepoužijeme slovo mutable).

Taktiež môžu obsahovať aj metódy (aj keď vo funkcionálnych jazykoch sa používajú skôr anemické objekty, takže do structu sa metódy pridávajú len výnimočne) a môžu dokonca aj implementovať interface (čo sa pri funkcionálnom programoavaní používa len málokedy), zato ale recordy nepodporujú dedičnosť. Ale namiesto dedičnosti majú veľmi zaujímavú vlastnosť vhodnú pre funkcionálne progrtamovanie.

Dá sa zobrať jeden record a druhý ním inicializovať príklad:

dajme tomu že máme typ:

type RGBAColor = { Red : int; Green : int; Blue : int; Alpha : single }

ten inicializujeme takto:

let RedPixel = {
    Red = 255
    Green = 0
    Blue = 0
    Alpha = 1.0f
}

a ak teraz dajme tomu že chceme nadefinovať nový žltý pixel (žltá je v RGB červená zmiešaná so zelenou) to znamená že namiesto toho aby sme takto definovali nový pixel:

let YellowPixel = {
    Red = 255
    Green = 255
    Blue = 0
    Alpha = 1.0f
}

tak môžme kludne zobrať ten červený a použiť operátor with:

let YellowPixel2 = { RedPixel with Green = 255 }

Ten nám skopíruje obsah celého RedPixel-u akurát property Green nastaví na inú hodnotu.

Rovnako vieme nastaviť aj viacero properties naraz:

let WhitePixel = {
    RedPixel with
        Green = 255
        Blue = 255
}

Pri funkcioanálnom programovaní, kde sa chceme vyhnúť zmenám hodnôt je to fajn.

Zaujímalo by ma či takýto syntaktický cukor (na automatické kopírovanie structu alebo class-u (s pár zmenenými hodnotami) má aj C++. A ak nie ako sa tieto veci v C++ riešia? Viem že sa to dá skopírovať manuálne a potom zmeniť hodnota, ale to už neni až také čisté riešenie. Chcel som si spraviť na jednom objekte fluent interface, ktoré vracia vždy nový objekt, ale hľadám podľa možnosti čo najmenej ukecané riešenie. Ďakujem.

POZN: Ak nechápete prečo nikde okrem deklarácie neuvádzam názvy typov tak je to kôli type inference. Typy treba explicitne uvádzať len tam kde by mohli navzájom kolidovať.

POZN2: okrem F# sa record rovnako kopíruje aj v ocaml (sekcia [b]Record copy[/b])

 
Odpovědět
7. ledna 20:42
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.