Re: explicit enum
Tom1s wrote:
Anyone know if they're considering adding "explicit enum" to the language?
I've read about such a proposal a few times. The essence of it is that when
you write:
explicit enum Colour { red, green, blue };
"red", "green" and "blue" aren't in the same scope as "Colour"; you've to
qualify them:
int main()
{
int k = red; /* Error */
int k = Colour::red;
}
It might be better to adapt recently added Java 5 enums for C++, see
http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html
For example, you Colour might look like this:
struct enum Color { red, green, blue };
void f()
{
int k = Color::red;
}
Note that I would propose "struct enum" or "class enum" instead of
"explicit enum" syntax.
In addition, it should be possible to support non-trivial constructors:
struct enum Color {
red = 0xFF0000, // constructed by Color(int)
green(0x00FF00), // constructed by Color(int)
blue(0, 0, 0xFF); // constructed by Color(int, int, int)
private:
const int value;
public:
Color(int value) : value(value) {}
Color(int r, int g, int b) : value((r << 16) | (g << 8) | b)) {}
operator int() { return value; }
};
Moreover, there should be constant-specific methods (implemented as by
derived classes):
struct enum Color {
red = 0xFF0000 { const char* name() { return "red" } },
green = 0x00FF00 { const char* name() { return "green" } },
blue = 0x0000FF { const char* name() { return "blue" } };
};
void f()
{
cout << Color::red.name() << endl; // prints "red"
}
In particular, the constant-specific name() method should be declared
implicitly, it is the most desired feature.
The implementation of this syntax is trivial.
--
Andrei Polushin
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]