Ahoj, hraju si s novými třídami v C++ a chtěl jsem použít “variant” pro reprezentaci a vyhodnocení jednoduchých aritmetických výrazů. Napsal jsem tedy generický typ Expr dědící z variant<T,Add<Expr<T>>,Mul<Expr<T>>>
ovšem překladač hlásí, že šablonu nelze specializovat (když chci třeba Expr<int>, překladač hlásí “field has incompatible type Expr<int>”). Nevíte, kde je chyba?
A to jsem se ani nedostal k vyhodnocování, kde mi použití “index()” přijde dost jako bad practice, jak byste to vyhodnotili vy?
Abych ti odpovedel, to co jsi napsal nemuze byt skompilovane z principu. variant neni nic jineho nez fancy objekt nad union{}.
Union funguje tak ze compiler vyhradi v pameti misto na nejvetsi datovy typ, ktery das do unionu a pak na "miste" toho unionu muze byt pritomny jakykoliv z datovych typu toho unionu.
Tj. z principu tehle definice, muzes do unionu /variantu dat jen datove typy u kterych je _jasne_ jakou maji velikost v pameti.
Coz v tenhle moment se nedivim ze nejde, protoze Expr pri rozhodovani o sve velikosti ... musi nastavi velikost na zaklade Add<Expr<T>>, ktery ale zavisi zase na velikosti Expr... A jakou velikost ma ted compiler zvolit?
typedef std::variant<T, std::unique_ptr<Add<T>>> Effort;
je alternativa ktera funguje