Thread overview
Introspection
Sep 23, 2008
Sean Kelly
Sep 23, 2008
BCS
Sep 23, 2008
BCS
Sep 23, 2008
Sean Kelly
Sep 23, 2008
Sean Kelly
September 23, 2008
Does anyone know a way to determine the type and offset of class/struct members?
It seems we already have all the necessary pieces, but I haven't been able to get it
to work thus far.  What I'm thinking of is something like this:

    import std.stdio;

    class C
    {
        int i;
        void* p;
    }

    void main()
    {
        foreach( e; typeof(C.tupleof) )
            writefln( e.stringof, " ", e.offsetof );
    }

However, offsetof doesn't appear to work on the members of this TypeTuple, nor on an instance tuple.  I've also tried various attempts at printing the address or value of the instance tuple, with no success.


Sean
September 23, 2008
Reply to Sean,

> Does anyone know a way to determine the type and offset of
> class/struct members?
> It seems we already have all the necessary pieces, but I haven't been
> able to get it
> to work thus far.  What I'm thinking of is something like this:
> import std.stdio;
> 
> class C
> {
> int i;
> void* p;
> }
> void main()
> {
> foreach( e; typeof(C.tupleof) )
> writefln( e.stringof, " ", e.offsetof );
> }
> However, offsetof doesn't appear to work on the members of this
> TypeTuple, nor on an instance tuple.  I've also tried various attempts
> at printing the address or value of the instance tuple, with no
> success.
> 
> Sean
> 

import std.stdio;

class C
{
int i;
void* p;
}

void main()
{
C c = new C;
foreach( i,e; c.tupleof )
writefln( typeof(e).stringof, " ", c.tupleof[i].offsetof );
}


September 23, 2008
== Quote from Sean Kelly (sean@invisibleduck.org)'s article
> Does anyone know a way to determine the type and offset of class/struct members?
> It seems we already have all the necessary pieces, but I haven't been able to get it
> to work thus far.  What I'm thinking of is something like this:
>     import std.stdio;
>     class C
>     {
>         int i;
>         void* p;
>     }
>     void main()
>     {
>         foreach( e; typeof(C.tupleof) )
>             writefln( e.stringof, " ", e.offsetof );
>     }
> However, offsetof doesn't appear to work on the members of this
> TypeTuple, nor on an instance tuple.  I've also tried various attempts
> at printing the address or value of the instance tuple, with no success.

Hm, now that I think about it, I bet this is possible with string mixins and __traits.


Sean
September 23, 2008
Reply to Benjamin,

> Reply to Sean,
> 
>> Does anyone know a way to determine the type and offset of
>> class/struct members?
>> It seems we already have all the necessary pieces, but I haven't been
>> able to get it
>> to work thus far.  What I'm thinking of is something like this:
>> import std.stdio;
>> class C
>> {
>> int i;
>> void* p;
>> }
>> void main()
>> {
>> foreach( e; typeof(C.tupleof) )
>> writefln( e.stringof, " ", e.offsetof );
>> }
>> However, offsetof doesn't appear to work on the members of this
>> TypeTuple, nor on an instance tuple.  I've also tried various
>> attempts
>> at printing the address or value of the instance tuple, with no
>> success.
>> Sean
>> 

cleaner:

import std.stdio;

class C
{
int i;
void* p;
}

void main()
{
foreach( i,e; typeof(C.tupleof) )
writefln( e.stringof, " ", C.tupleof[i].offsetof );
}


September 23, 2008
== Quote from BCS (ao@pathlink.com)'s article
> Reply to Benjamin,
> > Reply to Sean,
> >
> >> Does anyone know a way to determine the type and offset of
> >> class/struct members?
> >> It seems we already have all the necessary pieces, but I haven't been
> >> able to get it
> >> to work thus far.  What I'm thinking of is something like this:
> >> import std.stdio;
> >> class C
> >> {
> >> int i;
> >> void* p;
> >> }
> >> void main()
> >> {
> >> foreach( e; typeof(C.tupleof) )
> >> writefln( e.stringof, " ", e.offsetof );
> >> }
> >> However, offsetof doesn't appear to work on the members of this
> >> TypeTuple, nor on an instance tuple.  I've also tried various
> >> attempts
> >> at printing the address or value of the instance tuple, with no
> >> success.
> >> Sean
> >>
> cleaner:
> import std.stdio;
> class C
> {
> int i;
> void* p;
> }
> void main()
> {
> foreach( i,e; typeof(C.tupleof) )
> writefln( e.stringof, " ", C.tupleof[i].offsetof );
> }

Huh, e.offsetof doesn't work but C.tupleof[i].offsetof does.  At least I was close :-)  Thanks!


Sean