www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - A struct with a tuple as alias this, is kind of confusing

reply Yuxuan Shui <yshuiv7 gmail.com> writes:
First, it surprised me that I can't index a struct like that. So:

struct A(T...) {
     alias S = T;
     alias S this;
}

alias B = A!(int, double);
B[0] x; // Actually an array

Then, it surprised me again, that I actually can index it, 
sometimes

static if (!is(B[0] == B[1]))
     pragma(msg, "Works!");

Why is this language like this :(
Jul 27 2018
parent reply Yuxuan Shui <yshuiv7 gmail.com> writes:
On Friday, 27 July 2018 at 10:17:21 UTC, Yuxuan Shui wrote:
 First, it surprised me that I can't index a struct like that. 
 So:

 struct A(T...) {
     alias S = T;
     alias S this;
 }

 alias B = A!(int, double);
 B[0] x; // Actually an array

 Then, it surprised me again, that I actually can index it, 
 sometimes

 static if (!is(B[0] == B[1]))
     pragma(msg, "Works!");

 Why is this language like this :(
Oh no, is it just defining arrays in the is() statement, though? But wait, this works: alias C = A!(1,2,3); static if (C[0] < C[1]) pragma(msg, "Ha!");
Jul 27 2018
parent reply ag0aep6g <anonymous example.com> writes:
On 07/27/2018 12:19 PM, Yuxuan Shui wrote:
 On Friday, 27 July 2018 at 10:17:21 UTC, Yuxuan Shui wrote:
 First, it surprised me that I can't index a struct like that. So:

 struct A(T...) {
     alias S = T;
     alias S this;
 }

 alias B = A!(int, double);
 B[0] x; // Actually an array

 Then, it surprised me again, that I actually can index it, sometimes

 static if (!is(B[0] == B[1]))
     pragma(msg, "Works!");

 Why is this language like this :(
Oh no, is it just defining arrays in the is() statement, though?
Yup.
 But wait, this works:
 
 alias C = A!(1,2,3);
 static if (C[0] < C[1])
     pragma(msg, "Ha!");
Looks like DMD decides that `C[0]` and `C[1]` can't be types in that situation, so it tries the alias this. That's in line with how alias this is supposed to work: only kick in when the code wouldn't compile otherwise.
Jul 27 2018
parent Yuxuan Shui <yshuiv7 gmail.com> writes:
On Friday, 27 July 2018 at 10:48:08 UTC, ag0aep6g wrote:
 On 07/27/2018 12:19 PM, Yuxuan Shui wrote:
 On Friday, 27 July 2018 at 10:17:21 UTC, Yuxuan Shui wrote:
 [...]
Oh no, is it just defining arrays in the is() statement, though?
Yup.
 But wait, this works:
 
 alias C = A!(1,2,3);
 static if (C[0] < C[1])
     pragma(msg, "Ha!");
Looks like DMD decides that `C[0]` and `C[1]` can't be types in that situation, so it tries the alias this. That's in line with how alias this is supposed to work: only kick in when the code wouldn't compile otherwise.
Let's just say this is confusing as hell.
Jul 27 2018