Need Advice: Union or Variant?

jwatson-CO-edu real.name at colorado.edu
Thu Nov 17 22:16:04 UTC 2022


On Thursday, 17 November 2022 at 21:05:43 UTC, H. S. Teoh wrote:
>> 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

Thank you!  This seems nice except there are a few fields that 
need to coexist.
I need {`car`, `cdr`} -or- {`num`} -or- {`str`} -or- {`bul`}.
`err` will be outside the union as well because I have decided 
that any type can have an error code attached.  As in an error 
number (other than NaN) can be returned instead of reserving 
certain numbers to represent errors.  Imagine if there was NaN 
for every datatype.




More information about the Digitalmars-d-learn mailing list