enum

Steven Schveighoffer schveiguy at yahoo.com
Tue Apr 8 12:23:41 PDT 2014


On Tue, 08 Apr 2014 15:08:46 -0400, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> (moving http://goo.gl/ZISWwN to this group)
>
> On 4/7/14, 3:41 PM, w0rp wrote:
>> Yeah, I've seen this happen before. I think we could actually introduce
>> a little more type safety on enums without a great deal of breakage. It
>> would be nice to have a final switch give you as much of a guarantee
>> about what it's doing as it can.
>
> People use enums for things such as:
>
> 1. A discrete set of categorical values:
>
> enum State { initial, waiting, running, done }
>
> That's probably the most common use, and the one that prompted the  
> moniker "enum(eration)".
>
> On these, virtually no arithmetic makes any sense. At most, some notion  
> of State successor(State) and State predecessor(State) may be sensible.  
> It would return the next/previously naturally occurring discrete value,  
> and would either throw, assert, or saturate at limits.

I don't think this is necessarily true. Any kind of assumed order may be  
incorrect.

> 2. A collection of power-of-two flags that can be combined with "or" and  
> picked apart with "and".
>
> enum AccountFlags { active = 1, overdrawn, hasDiscount = 4, primary = 8 }

That overdrawn without a specific value!!! Please, nobody do that :)

> 3. A discrete set of categorical values, not all of which are named:
>
> enum UserID : ulong { nobody, expired = ulong.max }
>
> There would be no arithmetic/logic for such enums - they are only to  
> express categories. Comparisons for equality are needed; comparisons for  
> inequality may or may not be needed.
>
> 4. A "clone" of a type (usually numeric) that's generally used as a  
> helper for better typing.
>
> enum Kilogram : double {}
> enum Percent {}
>
> All usual arithmetic is supposed to work. The enum acts as a subtype of  
> its base type.

I haven't seen that use in a while. Is that something we want to promote?

> The current design is loose enough to accommodate all of the above uses,  
> probably too loose because it allows a bunch of nonsensical code to  
> compile. There are several questions to ask ourselves:
>
> 1. Is the current design damaging enough (= allows enough wrong/buggy  
> code to pass through) to warrant a breaking tightening?
>
> 2. To what extent can library-based approaches help?
>
> 3. What is the priority of improving enums in the larger picture of  
> other things we must do?

What about allowing enum methods? e.g.:

enum State
{
    initial, waiting, running, done;
    State next() { if(this == done) return done; return State(cast(int)this  
+ 1);}
}

I'm not sure what benefits this has over just defining a struct instead.  
In fact, an enum-as-a-type is essentially an easy-to-define wrapper struct.

Not sure if it's relevant to this discussion, but there are also anonymous  
enums.

-Steve


More information about the Digitalmars-d mailing list