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