Emulating enums

JS js.mdnq at gmail.com
Thu Aug 1 10:07:10 PDT 2013


On Thursday, 1 August 2013 at 16:36:34 UTC, Ali Çehreli wrote:
> On 08/01/2013 03:29 AM, JS wrote:
>
> > On Thursday, 1 August 2013 at 05:22:46 UTC, Ali Çehreli wrote:
> >> On 07/31/2013 06:10 PM, JS wrote:
> >>> http://dpaste.dzfl.pl/dbb40dbc
> >>>
> >>> The code was pared down from a lot of string mixin code
> generation. I
> >>> nest the structs because I want a nested enums. I don't
> want have to
> >>> have eState and eStateType but eState and eState.Type.
> >>>
> >>> Having the ability to nest enums would solve my problem.
> >>>
> >>> Regardless, I can almost achieve the effect with nested
> structs but not
> >>> quite.
> >>>
> >>> In the code, I cannot assign to the struct for some reason
> even with
> >>> alias this on iB, which should make State act like the int
> Value.
> >>>
> >>> i.e.,
> >>>
> >>> b.State.Value = Enums.State.A;
> >>>
> >>> works but
> >>>
> >>> b.State = Enums.State.A;
> >>>
> >>> doesn't
> >>>
> >>> It maybe some stupid error on my part but I can't keep my
> eyes open
> >>> enough to figure it out...
> >>>
> >>>
> >>>
> >>
> >> For that assignment to work, the left-hand side must be
> assignable.
> >> However, the property function State() returns Enums.eState
> by-value.
> >>
> >> The following has the same issue:
> >>
> >> struct S
> >> {
> >>     int i_;
> >>
> >>     @property int i() {
> >>         return i_;
> >>     }
> >>
> >>     alias i this;
> >> }
> >>
> >> void main()
> >> {
> >>     auto s = S();
> >>     s = 42;
> >>     assert(s.i == 42);
> >> }
> >>
> >> Error: cannot implicitly convert expression (42) of type int
> to S
> >>
> >> To compile, i() must return an lvalue:
> >>
> >>     @property ref int i() {
>
> Although, what I said seems more like a workaround because you 
> already had a setter @property. You shouldn't need to make the 
> getter return a reference as well... I guess...
>
> I think what is at play here is the current implementation 
> limitation of "a single 'alias this' per type." I think 'alias 
> this' happens to pick the getter perhaps because the getter 
> function is defined first in the class. I don't know...
>
> Ali


Yeah, I think I remember that being an issue before which kinda 
sucks as one doesn't want to have to necessarily return 
references.

alias this should also alias all the overloads.

In any case, how long has the multiple alias issue been going on? 
10 years?


More information about the Digitalmars-d-learn mailing list