Cannot get the offset of static members of a struct

struct X
{
    __gshared public:
        int x;
}


X.x.offsetof < invalid.

We can clearly get a pointer to the static struct X since &X.x is effectively the address of X(regardless nomenclature and terminology issues in D trying to hide this).

e.g.,

auto p = cast(X*)&X.x;

will, for all practical purposes be a pointer to X.


auto GetStaticAddress(T)()
{
        mixin("auto p = cast(T*)&T."~__traits(allMembers, T)[0]~";");
        return p;
}

Of course, assuming that the first member is at the same location as the start of the struct and the elements are laid out in the same positions(not sure if this is guaranteed, but probably is).

Would be much nicer if we could just take the address of a static struct



This is pretty useful for simplification:

auto GetStaticAddress(T)()
{
        mixin("auto p = cast(T*)&T."~__traits(allMembers, T)[0]~";");
        return p;
}

auto GetOpts(T)(string[] args)
{       
        import std.getopt, std.meta, std.traits;
        auto t = GetStaticAddress!(T)();
        
        string combine()
        {
                string s = "";
                foreach(m; AliasSeq!(__traits(allMembers, T)))
                {
                        mixin("enum a = __traits(getAttributes, T."~m~")[0];");
                        mixin("s ~= \"`"~a~"`, &"~T.stringof~"."~m~", \";");
                }
                return s;
        }

        enum s = combine();
        mixin("return getopt(args, "~s~");");
}

struct X
{
        align(1):
        __gshared public static:
                @("A") bool A;
                @("B") string B;      
                @("C") string[] C;
};


which allows us to do

GetOps!X(args)

vs

getop(args, "A", &X.A, "B", &X.B, "C", &X.C);


Could be improved to only deal with special argument attributes on X's fields and allow for non-static strucs(for the general case of mapping). Sort of a map between attribute space on a type and some function.




Reply via email to