hOn 07/03/2017 10:13 AM, Paolo Invernizzi wrote:

> It's not exactly the same, as first and second should be struct with
> partial fields from Foo, of different types.

I had difficulty understanding the requirements. For example, it's not clear whether you want the literal "first" and "second" names.

If you want to magically use part of a struct as a separate type, it's impossible in a strongly typed language like D. However, you have low-level options that allow you to lay data almost in any way you want.

Obviously, if you have access to Foo's source and it's feasible to change it, you can do this:

struct Foo {
    A a;
    B b;
}

Assuming that it's not possible, you can cast addresses of parts of the struct as addresses of other types. Compiles but not tested:

struct Foo {
    int a_1; float a_2; string a_3;
    string b_1; double b_2;
}

struct A {
    int a_1; float a_2; string a_3;
}

struct B {
    string b_1; double b_2;
}

auto ref a(ref Foo foo) {
    return *cast(A*)&foo.a_1;
}

auto ref b(ref Foo foo) {
    return *cast(B*)&foo.b_1;
}

void worksOnA(ref A a) {
}

void worksOnB(ref B b) {
}

void main() {
    auto foo = Foo();
    foo.a.worksOnA();
    foo.b.worksOnB();
}

Ali

Reply via email to