Thread overview | ||||||
---|---|---|---|---|---|---|
|
July 27, 2018 A struct with a tuple as alias this, is kind of confusing | ||||
---|---|---|---|---|
| ||||
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 :( |
July 27, 2018 Re: A struct with a tuple as alias this, is kind of confusing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Yuxuan Shui | 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!");
|
July 27, 2018 Re: A struct with a tuple as alias this, is kind of confusing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Yuxuan Shui | 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. |
July 27, 2018 Re: A struct with a tuple as alias this, is kind of confusing | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | 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.
|
Copyright © 1999-2021 by the D Language Foundation