| Thread overview | |||||
|---|---|---|---|---|---|
|
December 05, 2008 Is __traits(derivedMembers) supposed to return mangled names? | ||||
|---|---|---|---|---|
| ||||
The language spec is ambiguous, and DMD can apparently do either. This program prints [a __T3TagS23_D11smartstruct4Test1aiVi1Z b __T3TagS24_D11smartstruct4Test1bAaVi2Z] Note: this is a lame-ass hack around the lack of real metadata attributes in D2. It'd be nice if the real thing was supported. import std.stdio; template Tag(alias m, int i) { mixin("const int tag_" ~ m.stringof ~ " = " ~ i.stringof ~ ";"); }; class Test { int a; mixin Tag!(a, 1); char[] b; mixin Tag!(b, 2); }; int main(char[][] args) { writefln(__traits(derivedMembers, Test)); return 0; } | ||||
December 05, 2008 Re: Is __traits(derivedMembers) supposed to return mangled names? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Mike Hearn | On Sat, 06 Dec 2008 00:13:40 +0300, Mike Hearn <mike@plan99.net> wrote:
> The language spec is ambiguous, and DMD can apparently do either. This program prints
>
> [a __T3TagS23_D11smartstruct4Test1aiVi1Z b __T3TagS24_D11smartstruct4Test1bAaVi2Z]
>
> Note: this is a lame-ass hack around the lack of real metadata attributes in D2. It'd be nice if the real thing was supported.
>
>
> import std.stdio;
>
> template Tag(alias m, int i) {
> mixin("const int tag_" ~ m.stringof ~ " = " ~ i.stringof ~ ";");
> };
>
> class Test {
> int a; mixin Tag!(a, 1);
> char[] b; mixin Tag!(b, 2);
> };
>
> int main(char[][] args) {
> writefln(__traits(derivedMembers, Test));
> return 0;
> }
>
Yeah, I'm using the same hack (i.e. defining private static const members) to denote some members characteristics, e.g. whether a member is serializable, its value is written to log etc.
| |||
December 05, 2008 Re: Is __traits(derivedMembers) supposed to return mangled names? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Denis Koroskin | > Yeah, I'm using the same hack (i.e. defining private static const members) to denote some members characteristics, e.g. whether a member is serializable, its value is written to log etc. Is the code open source? I was intending to put together some kind of better integrated protobufs equivalent, ie with the same concept of optional/required tagged fields and efficient serialization, but type safe and better integrated with the language. Another oddity of __traits, this prints dump! a __T3TagS23_D11smartstruct4Test1aiVi1Z b __T3TagS24_D11smartstruct4Test1bAaVi2Z __T11SmartStructZ So dump() isn't considered a member, but the name of the mixin does appear! import std.stdio; template Tag(alias m, int i) { mixin("const int tag_" ~ m.stringof ~ " = " ~ i.stringof ~ ";"); }; template SmartStruct() { void dump() { writefln("dump!"); } }; struct Test { int a; mixin Tag!(a, 1); char[] b; mixin Tag!(b, 2); mixin SmartStruct; }; int main(char[][] args) { Test t; t.dump(); foreach (member; __traits(allMembers, Test)) { writefln(member); } return 0; } | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply