You could use a UDA like that, though getting the offset will be a bit tricky.

The idea is to use some uda type, even plain string is good enough, then use the __traits to find the first appearance of that UDA in the object and return that offset.

Keep in mind that the @uda: syntax applies it to ALL following members, it isn't really a label, but if we only look at the first time it shows up we can kinda pretend it is one.

Here's an example:


struct Foo {
        int b;
        @("label_one"): // offset 4
        int c;
        int d;
        @("label_two"): // offset 12
        int e;
}

// get the offset of the label on a type, see below for usage
size_t offsetOf(T, string label)() {
        foreach(memberName; __traits(allMembers, T)) {
foreach(attribute; __traits(getAttributes, __traits(getMember, T, memberName))) { static if(is(typeof(attribute) == string) && attribute == label)
                                return __traits(getMember, T, 
memberName).offsetof;
                }
        }

        assert(0, "no such label");
}

void main() {
       // gives what we expect
        pragma(msg, offsetOf!(Foo, "label_one"));
        pragma(msg, offsetOf!(Foo, "label_two"));
}

Reply via email to