## digitalmars.D - Re: strong enums: why implicit conversion to basetype?

``` ///T of type ENUM, and S of an integral.
struct HandleFlags(T, S)
=A0 {
=A0=A0=A0 S state;=A0=A0=A0 ///Holds

=A0=A0=A0 alias T T_Enum;

=A0=A0=A0=A0=A0this(T[] setFlags...);

=A0=A0=A0 ///Returns true/false if a specific

=A0=A0=A0 bool check(T[] flag...);

=A0=A0=A0 ///Returns true/false if all flags are set

=A0=A0=A0 bool checkAll(T[] flag...);
=A0=A0=A0=20
=A0=A0=A0 /**
=A0=A0=A0 Checks if a flag has been set,

the Else flag.
=A0=A0=A0 */
=A0=A0=A0 T checkElse(T Else, T[] flag...);

=A0=A0=A0 ///Sets specific flag(s) on
=A0=A0=A0 void setFlag(T[] flag...);

=A0=A0=A0 ///turns listed flags off.
=A0=A0=A0 void clearFlag(T[] flag...);

=A0=A0=A0 ///reverses the state of a specific

=A0=A0=A0 void flipFlag(T[] flag...);
}

Is it possible to 'auto-detect' the integral type? I makes
little sense to use a signed type or a type too small for the enum for
example.

Yes, I suppose it could auto detect it, however having it the smallest size=
possible isn't the right answer. If you begin using enums for your flags a=
nd you are accessing C code that uses it's enums, it may only use 10 bits b=
ut uses a 32bit value. Hopefully by having only one data member (of your in=
t type) you can safely forcibly cast it (If it's the same size)

And in the same fashion: Do you map an enum value to "1 << enum_value" in=

am biased for everything that works the same way. It is also the most=A0 n=
atural way to work with enums that can be represented as a bit field IMO.=
=A0=20

Current implementation you are explicit (ie 0x1000); Wouldn't be hard to u=
se a mixin function to do the work for you.

This means that enum values cannot be larger than 63 of course (so they f=

What else? hmm? I'm wondering if the documentation for flipFlag should be=

Correct. So if flag A was set and B wasn't, and you flip both, B is set an=
d A isn't. I'm using variadic functions since if you know you are doing mul=
tiple flags you shouldn't be required to make x calls when you don't need t=
o.

How is checkElse supposed to work. I could imagine the function of a =20
method with the signature "T (T flag, T else)". What is the use case for =

e.

I've updated the signature to use "const T checkElse(T Else, T flag...)". N=
ow how you would use this is if you want an ENUM flag returned and not a tr=
ue/false, but you don't want to have to manually check. so you can do this.=
(Returns first true ENUM, or if it fails return Else)

HandleFlags!(E, int) Flags;

somefunc(Flags.checkElse(ETEST.unused, ETEST.isMaster, ETEST.isSlave), ...)

Rather than..
if (Flags.check(TEST.isMaster))
somefunc(ETEST.isMaster, ...)
else if (Flags.check(TEST.isSlave))
somefunc(ETEST.isSlave, ...)
else
somefunc(ETEST.unused, ...)