Getting member type string
Max Samukha
samukha at voliacable.com.removethis
Thu Jul 26 23:12:15 PDT 2007
The problem is to write a generic function that would be able to take
the name of a struct or class data member and return a string
representing the type of that member, both at compile time and at run
time.
I came up with the following (hackish) solution (for dmd 2.003):
// Had to add this to workaround the foreach on tuples bugs
private template Members(T, size_t idx = 0)
{
static if (idx < T.tupleof.length)
{
const char[][] members = ([T.tupleof[idx].stringof]
~ Members!(T, idx + 1).members);
const char[][] types = ([typeof(T.tupleof[idx]).stringof]
~ Members!(T, idx + 1).types);
}
else
{
const char[][] members = [];
const char[][] types = [];
}
}
string getMemberType(T)(string memberName)
{
foreach (i, s; Members!(T).members)
{
if (s.length > memberName.length
&& s[$ - memberName.length .. $] == memberName
&& s[$ - memberName.length - 1] == '.')
return Members!(T).types[i];
}
assert(false, "No member " ~ memberName ~ " for type " ~
T.stringof);
}
class A
{
char[][] a;
}
void main()
{
//writefln(a);
static compileTime = getMemberType!(A)("a");
auto runTime = getMemberType!(A)("a");
writefln("Compile time: " ~ compileTime);
writefln("Run time: " ~ runTime);
}
--------
Does anybody know a better way? Maybe using the new __traits? Thanks.
More information about the Digitalmars-d-learn
mailing list