On 03/16/2015 01:24 PM, via Digitalmars-d-learn wrote:
The problem in your example is that your making a copy of the returned data. Of course any changes to that copy won't affect the original. You need to return a pointer to it (`ref` won't do if you want to store it in a local variable, because these can't be `ref`).

struct BlockHead
{
    uint magic = 20150312;
    uint magic2;
    uint blockSize;
    uint unused1;
    ulong unused2;
    ulong spare[61];

    T* embedded(T)() {
        static assert(T.sizeof < spare.length);
        return cast(T*) spare.ptr;
    }
}

How to use it:

void useIt(ref BlockHead bh) {
    static struct InternalData {
        int foo;
        ubyte[20] bar;
    }

    auto data = bh.embedded!InternalData;
    data.foo = 42;
}

Nice!  That looks like exactly what I was hoping for.

Reply via email to