enumerating member offsetofs via foreach over members-tuple
Steven Schveighoffer
schveiguy at yahoo.com
Fri Nov 14 13:30:24 PST 2008
"Denis Koroskin" wrote
> I'm doing some meta stuff and came across a few problems.
>
> First of is described here:
> http://d.puremagic.com/issues/show_bug.cgi?id=2454
Bug reports without actual errors listed in them (i.e. 'try this and see
what happens') will probably be ignored. It would do you good to show what
the errors are.
> Second one is slightly different and this time I am less sure whether it
> is a bug.
> The following code is indetended to print offsets of all its members:
>
> struct Test
> {
> short s;
> int i;
> float f;
> double d;
>
> void test()
> {
> writefln("expected output:");
> writefln( cast(char*)&s - cast(char*)this ); //
> writefln(s.offsetof);
> writefln( cast(char*)&i - cast(char*)this ); //
> writefln(i.offsetof);
> writefln( cast(char*)&f - cast(char*)this ); //
> writefln(f.offsetof);
> writefln( cast(char*)&d - cast(char*)this ); //
> writefln(d.offsetof);
>
> writefln("actual output:");
> foreach (m; this.tupleof) {
> // writefln(m.offsetof); // Error: no property 'offsetof' for
> type 'short'
> writefln( cast(char*)&m - cast(char*)this);
> }
> }
> }
>
> expected output:
> 0
> 4
> 8
> 16
>
> actual output:
> -52
> -48
> -44
> -40
>
> Am I doing something wrong?
Yes, in the code:
foreach(m; this.tupleof)
m is a variable local to the for loop, not a reference to the actual tuple
member.
I'm not sure foreach(ref m; this.tupleof) will work, I haven't done much
with tuples.
But certainly if ref m does work, the
writefln( cast(char *)&m - cast(char *)this);
should be accurate.
But m.offsetof probably won't, since at that point, m is simply a ref local
variable, not a member of the struct.
I think possibly the only way offsetof works is in the form
aggregate.member.offsetof. I could be totally wrong.
-Steve
More information about the Digitalmars-d
mailing list