Robert Clipsham wrote: > Hey all, > > I was wondering if anyone could enlighten me as to why the following > code does not compile (dmd2, latest release or the beta): > ---- > struct Foo > { > int a; > } > > string test() > { > string str = "struct " ~ Foo.stringof ~ "_{"; > foreach (j, f; Foo.tupleof) > { > enum fullFieldName = Foo.tupleof[j].stringof; > str ~= typeof(f).stringof ~ ' ' ~ > fullFieldName[Foo.stringof.length + 3 .. $]; > } > return str ~ "}"; > } > > void main() > { > mixin(test()); > } > ---- > If fails with the errors: > test.d(9): Error: Cannot interpret Foo at compile time > test.d(19): Error: cannot evaluate test() at compile time > test.d(19): Error: argument to mixin must be a string, not (test()) > test.d(19): Error: cannot evaluate test() at compile time > test.d(19): Error: argument to mixin must be a string, not (test()) > > Thanks, >
test also doesn't compile normally on my box, dmd errors on Foo.tupleof. Not sure if this is illegal or not. I think you want the allMembers trait or something similar. Something like this: import std.traits; string test(T)() { string str = "struct " ~ T.stringof ~ "_{"; alias FieldTypeTuple!T FieldTypes; foreach (i, fieldName; __traits(allMembers, T ) ) { str ~= FieldTypes[i].stringof ~ " " ~ fieldName ~ ";"; } return str ~ "}"; } This works for your example but is a bit crude, I'm sorry for that, you'll have to modify it. ( allMembers also returns functions, including ctors while FieldTypeTuple doesn't. I also haven't read anything about the order in which FieldTypeTuple and allMembers return their elements )