Emulating enums

Ali Çehreli acehreli at yahoo.com
Thu Aug 1 09:36:33 PDT 2013


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



More information about the Digitalmars-d-learn mailing list