Enum "Inheritance"?

spir denis.spir at gmail.com
Sun Feb 27 06:48:01 PST 2011


On 02/27/2011 04:20 AM, Nick Sabalausky wrote:
> "Nick Sabalausky"<a at a.a>  wrote in message
> news:ikcepj$248p$1 at digitalmars.com...
>>
>> I think your main original problem was that there isn't really a way to
>> compose enums additively, only subtractive.
>>
>
> That just gave me an idea: I think you should be able to get away with an
> ordinary union:
>
> enum STD {
>      STD_ELEMENT_1 = 17,
>      STD_ELEMENT_2 = 42,
> }
>
> enum AOnly {
>      A_ACCESS_1 = 0x80,
> }
>
> enum BOnly {
>      B_ACCESS_1 = 0x80,
> }
>
> union A {
>      STD std;
>      A a;
> }
>
> union B {
>      STD std;
>      B b;
> }
>
> void funcA(A a) {
>      if(a.a == A_ACCESS_1) {}
>      if(a.std == STD_ELEMENT_1) {}
> }
>
> void funcB(B b) {
>      if(b.b == B_ACCESS_1) {}
>      if(b.std == STD_ELEMENT_1) {}
> }
>
> In the general case, I'd be very hesitent to use a non-tagged union like
> this, because it wouldn't provide protection against accidentally having the
> same integer value for a member of STD and a member of A or B (which would
> obviously screw the whole thing up). But in your paricular case it doesn't
> seem that would likely be an issue.
>
> Of course, if you dodn't mind a heavier-weight OO-based solution, you could
> always use classes instead of enums and use static immutable class members
> as the possible values (and make the constructor private to prevent
> additional possible values), but personally I think that would be
> over-engineered compared to either the above or the mixin solution in my
> previous message.

Very interesting solution, indeed: enum composition via union. I think as well 
it's safe because --per definition-- each 'code' of a discriminating enum must 
have a distinct value. (They are nominals: 
http://en.wikipedia.org/wiki/Nominal_number).

Denis
-- 
_________________
vita es estrany
spir.wikidot.com



More information about the Digitalmars-d mailing list