Need Advice: Union or Variant?
H. S. Teoh
hsteoh at qfbox.info
Thu Nov 17 21:05:43 UTC 2022
On Thu, Nov 17, 2022 at 08:54:46PM +0000, jwatson-CO-edu via Digitalmars-d-learn wrote:
[...]
> ```d
> enum F_Type{
> CONS, // Cons pair
> STRN, // String/Symbol
> NMBR, // Number
> EROR, // Error object
> BOOL, // Boolean value
> FUNC, // Function
> }
>
> struct Atom{
> F_Type kind; // ---------------- What kind of atom this is
> Atom* car; // ----------------- Left `Atom` Pointer
> Atom* cdr; // ----------------- Right `Atom` Pointer
> double num; // ----------------- Number value
> string str; // ----------------- String value, D-string underlies
> bool bul; // ----------------- Boolean value
> F_Error err = F_Error.NOVALUE; // Error code
> }
>
> ```
> Question:
> **Where do I begin my consolidation of space within `Atom`? Do I use
> unions or variants?**
In this case, since you're already keeping track of what type of data is
being stored in an Atom, use a union:
struct Atom {
F_Type kind;
union { // anonymous union
Atom* car; // ----------------- Left `Atom` Pointer
Atom* cdr; // ----------------- Right `Atom` Pointer
double num; // ----------------- Number value
string str; // ----------------- String value, D-string underlies
bool bul; // ----------------- Boolean value
F_Error err = F_Error.NOVALUE; // Error code
}
}
Use Variant if you don't want to keep track of the type yourself.
T
--
An elephant: A mouse built to government specifications. -- Robert Heinlein
More information about the Digitalmars-d-learn
mailing list