Comment #0 by timothee.cour2 — 2016-06-21T18:13:16Z
enum A{
a1,
a2,
}
struct B{
A b1;
string b2;
int c3;
}
import std.conv:to;
void main(){
auto b=B(A.a1, "foo", 13);
enum b_string=`B(a1, "foo", 13)`;
assert(b.to!string == b_string);
mixin(`auto b1=B(A.a1, "foo", 13);`);//works
//mixin(`auto b2=`~b_string~`;`);//Error: undefined identifier 'a1'
}
Pretty much every type in D works when reconstructing as I did above:
mixin(`auto b2=`~b.to!string~`;`);
except when there's an enum type somewhere inside
What's a workaround?
Comment #1 by b2.temp — 2016-06-21T19:01:55Z
I think that any fix directly in to() can break a lot of code because currently to!string and to!E work together. I'm sure that it's already used as it is now by many people.
The fix, if any, should maintain the old behvior and allow to get the identifier when explicitly needed, for example:
auto toImpl(T, S, bool fq = false)(auto ref E e)
if (is(S == enum) && is(T==string))
{}
with "fq" a CT bool that indicates if the output includes the "enum identifier".
"Fully qualified" would mean that even the module name would be included so I suppose that what you want is actually the enum identifier.
----
By the way why do you report this as a dmd (and not phobos) issue ?
Comment #2 by robert.schadek — 2024-12-01T16:27:18Z