On 8/14/17 9:49 AM, Carl Sturtivant wrote:
   struct mess
   {
     union
     {
         int i;
         string s;
     }
     double x;
   }

How do I cleanly initialize this, assuming it's i that I want to give an overt value to?

The docs say "If there are anonymous unions in the struct, only the first member of the anonymous union can be initialized with a struct literal, and all subsequent non-overlapping fields are default initialized". This is not helpful.
https://dlang.org/spec/struct.html#struct-literal

The above is a toy example distilled from a real problem. The struct comes from a C library and is very long and contains several anonymous unions. The D declaration of the struct was made by someone else who made the library available to D.

I printed out such a struct returned by a call to the library, and wanted to create my own from scratch. But it seems that I can't just copy what writeln printed and edit it into an initialization analogous to

   mess m = { 99, 3.14 };

with the above, because I just get the analog of

Error: overlapping initialization for field i and s
Error: cannot implicitly convert expression (3.14) of type double to string

I think what the docs mean is that as soon as an anonymous union is present, you can't initialize anything further than the first union field.

and the alternative more like what is printed by writeln,

   auto m = mess(99, 3.14);

produces a similar error message.

So it seems I am forced to assign explicitly to each member of the struct, an ugly process.

What is a nice way to solve this problem?

I think the only way to solve it is with a constructor:

this(int ival, double xval) { i = ival; x = xval; }

-Steve

Reply via email to