Thread overview
offsetof + foreach
Sep 07, 2012
Ellery Newcomer
Sep 07, 2012
Ellery Newcomer
Sep 08, 2012
Kenji Hara
September 07, 2012
I have a struct buffer, and I want to print out its members' offsetof.

This:

foreach(i,_t; buffer.tupleof) {
            writefln("%s@: %s", _t.stringof, _t.offsetof);
        }

complains

Error: undefined identifier 'offsetof'

what should I be doing?
September 07, 2012
On 09/07/2012 10:31 AM, Ellery Newcomer wrote:
> I have a struct buffer, and I want to print out its members' offsetof.
>
> This:
>
> foreach(i,_t; buffer.tupleof) {
>              writefln("%s@: %s", _t.stringof, _t.offsetof);
>          }
>
> complains
>
> Error: undefined identifier 'offsetof'
>
> what should I be doing?

nevermind, I remember tupleof + foreach has always been broken

writefln("%s@: %s", buffer.tupleof[i].stringof, buffer.tupleof[i].offsetof);
September 08, 2012
On Friday, 7 September 2012 at 17:32:43 UTC, Ellery Newcomer wrote:
> On 09/07/2012 10:31 AM, Ellery Newcomer wrote:
>> I have a struct buffer, and I want to print out its members' offsetof.
>>
>> This:
>>
>> foreach(i,_t; buffer.tupleof) {
>>             writefln("%s@: %s", _t.stringof, _t.offsetof);
>>         }
>>
>> complains
>>
>> Error: undefined identifier 'offsetof'
>>
>> what should I be doing?
>
> nevermind, I remember tupleof + foreach has always been broken
>
> writefln("%s@: %s", buffer.tupleof[i].stringof, buffer.tupleof[i].offsetof);

I think this is expected behavior.
In foreach body, _t is a copy of field value, and it's not buffer's field itself.

Your code is equivalent with:

    foreach(i,_; buffer.tupleof) {
        auto _t = buffer.tupleof[i];	// _t is a normal variable
        writefln("%s@: %s", _t.stringof, _t.offsetof);
    }

Then you cannot get offsetof property from _t;

Regards.

Kenji Hara