Dobrý deň, ďakujem Vám za odpovede. Zatiaľ som ich preletel len veľmi rýchlo. Zajtra si ich prečítam a poodpisujem. (Doteraz som kôli práci nestíhal).
Len v skratke: viem, že existuje viacero spôsobov, ako niečo podobné docieliť a tiež viem, že sa to dá spraviť aj flexibilnejšie. Bol to len príklad, ktorý ma v rýchlosti napadol pre vysvetlenie aby ste pochopili ako to funguje a čo vlastne v C++ hľadám. Sú veci na, ktoré sa discriminated unions hodia. Už len taký typ option(v haskelli sa mu hovorí maybe) je discriminated union:
type Option<'t> =
| Some of 't
| None
alebo si môžete nadefinovať typ:
type LoginResult =
| Auth of {| Uid : int64; Login : string; Password : string; FirstName : string; Roles : Roles; Profile : Profile |}
| InvalidField of int * string * string
| Error of int * string
A vyhnete sa tak používaniu výnimiek
alebo si môžete vytvoriť rekurzívnu discriminated union
type MultiTree<'a> =
| Leaf of 'a
| Node of MultiTree<'a> list
prípadne
type ast =
| Nil
| Unit
| Identifier of string
| IdentifiersPath of string list
| Block of ast list
| ExprList of ast list
| Root of ast list
...
Pointa je, že by som potreboval niečo, čo sa vzdialenie podobá na úniu z Ocaml, dá sa do nej vložiť napríklad aj viacero typov, ale nechcem aby únia rozlišovala hodnoty podľa typu, ale podľa tagu.
S tým zadrátovaním máte pravdu, tento príklad by som v praxi aj ja riešil inak.
Že sa niečo v Ruste dá riešiť elegantnejšie viem. Rust je veľmi pekný jazyk. Ja tiež používam jazyky z rodiny ML, ktoré sú ideálne na rýchly vývoj aplikácií a v ktorých je radosť programovať, ale C++ baví z viacerých dôvodov (je univerzálne, je rozšírené, dá sa tam hrať z detailami a optimalizovať, je to hlavný jazyk pre Unreal Engine, je to jazyk orientovaný na rýchlosť, nič pred programátorom neskrýva atď). Ale máte pravdu, že má aj veľa nedostatkov.