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