On Sunday, 11 February 2018 at 19:33:23 UTC, Alex wrote:
On Sunday, 11 February 2018 at 15:18:11 UTC, Simen Kjærås wrote:


Basically, Typedef looks like this:

struct Typedef(T) {
    T _payload;
    // Forward method calls, member access, etc, to _payload.
}

If T looks like this:

struct T {
    static int[3] arr;
    void foo() { arr[0]++; }
}

How is Typedef supposed to wrap T.foo in such a way that it uses a different arr depending on whether it's called from the Typedef or from T?

--
  Simen

In the same way as it is handled by this:

/// --- code --- ///

void main(){}

static assert(T.arr.ptr != S.arr.ptr);

struct T {
    static int[3] arr;
    void foo() { arr[0]++; }
}

struct S {
    static int[3] arr;
    void foo() { arr[0]++; }
}

/// --- code ends --- ///

I understand that Typedef should be kept simple. But if it defines a type which is recognized as another type in respect to the underlying one, then I should be able to rely on independence of everything, like I would copy/paste the implementation. Or do I misinterpret something?

I agree that'd be nice. Sadly, it's not a reasonable expectation. :(

A more extreme example: You have a compiled library, and some .di (header) files. In one of those files is this code:

struct S {
    static int[] arr;
    void foo();
}

Now how should Typedef go about making foo() do the right thing? Even with compiler support, this is impossible - the source of S.foo is simply not available, and it doesn't take the address of the static data as a parameter anywhere.

--
  Simen

Reply via email to