Boost logo

Boost :

From: John Torjo (john_at_[hidden])
Date: 2003-05-27 11:23:12


----- Original Message -----
From: "Reece Dunn" <msclrhd_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Tuesday, May 27, 2003 1:57 PM
Subject: Re: [boost] Re: Enum operators

> I have adopted a Java-style approach to enumerated-style values (don't
know
> if this is the best approach, just the way that I do it now). For example:
>
> class WhatIsTheMatrix
> {
> public:
> typedef unsigned char type;
> public:
> static const type TheWhat = 0;
> static const type Matrix = 1;
> static const type AniMatrix = 2;
> static const type MatrixReloaded = 3;
> static const type MatrixRevolutions = 4;
> };

I think this is really cool!

Basically, you should be able to do
WhatIsTheMatrix::type m = WhatIsTheMatrix::TheWhat;
++m;
switch( m) {
case WhatIsTheMatrix::TheWhat: //...
case WhatIsTheMatrix::AniMatrix: //...
...
}

The unfortunate thing is that you lose compile-time checking. You'll be able
to say something like
WhatIsTheMatrix::type m = 20;

What I would really love is some library to allow me to do something similar
to this:

ENUM(Variant) { VT_I1, VT_I2, VT_I4, VT_BSTR, BIT_FLAGS( VT_BYREF,
VT_ARRAY) };

Here's how it should roughly behave:
Variant a = VT_I1; // ok
Variant b = VT_I1 | VT_BSTR; // error
Variant c = VT_I1 | VT_I4; // error
Variant d = VT_I1 | VT_ARRAY; // ok - using with bitflag
Variant e = VT_BSTR | VT_ARRAY | VT_BYREF; // ok - using with bitflags

I'm not sure operators like ++,--, +,-, etc. should be made workable for
enums.
If you actually want that, use ints.
Just think about something like this:

Day a = Thursday;
Day b = Wednesday;
Day c = a + b;

(note: I once created a library that for a given enumerator that could
contain bit-flags, allowed showing its user-friendly string in debug mode -
like, for e, it would be "VT_BSTR | VT_ARRAY | VT_BYREF")

Best,
John
>
> It could be possible to use the suggestions for enumerated type traits to
> support this form and convert the class into its own data type, so you
could
> use it like:
>
> WhatIsTheMatrix witm(); // initialized to WhatIsTheMatrix::TheWhat
> WhatIsTheMatrix neo( WhatIsTheMatrix::MatrixReloaded );
>
> if( witm == neo ) ...;
> else ...;
>
> -- just an idea.
>
> Regards,
> Reece
>
> _________________________________________________________________
> Stay in touch with absent friends - get MSN Messenger
> http://www.msn.co.uk/messenger
>
> _______________________________________________
> Unsubscribe & other changes:
http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk