106
Vývoj / Discriminated unions v C++
« kdy: 21. 10. 2020, 23:09:51 »
C++ obsahuje únie, ktoré umožňujú na jedno miesto v pamäti uložiť rozličné typy. Práca s úniami je však krkolomná a všetko si musí ošéfovať porogramátor.
STL obsahuje typ std::variant. Ten má nevýhodu zas v tom, že nerozlišuje hodnoty podľa názvov tagu, ale podľa číselného indexu alebo typu. Taktiež nemôže obsahovať rovnaký typ označený odlišným tagom
Niekto si možno položí otázku načo potrebujem mať v únii rovnaký typ viac krát. Tak uvediem príklad:
Neviete o niečom takom aj pre C++? Ideálne keby to bolo súčasťou STL alebo Boostu.
STL obsahuje typ std::variant. Ten má nevýhodu zas v tom, že nerozlišuje hodnoty podľa názvov tagu, ale podľa číselného indexu alebo typu. Taktiež nemôže obsahovať rovnaký typ označený odlišným tagom
Niekto si možno položí otázku načo potrebujem mať v únii rovnaký typ viac krát. Tak uvediem príklad:
Kód: [Vybrat]
type Currency =
| USD of decimal
| EUR of decimal
| BTC of decimal
| Another of (currencyName : string) * decimal
| None
let toUSD (value : Currency) =
match value with
| USD val -> val
| EUR val -> val * usdEurCourse
| BTC val -> val * usdBtcCourse
| _ -> failwith "Unsupported currency"
let comodityMarketsValues = Map [
"Gold", USD(5.75M)
"Platinium DAX", EUR(5.23M)
"FSTE Oil", Another("GBP", 1023.22M)
]
let comodityMarketsValuesInUSD = comodityMarketsValues |> Map.map(fun key value -> value |> toUSD)Neviete o niečom takom aj pre C++? Ideálne keby to bolo súčasťou STL alebo Boostu.