Re: Wrapping enums
posted:
One problem with enums is that they export the symbolic names in
their
enclosing namespace
I've copy-pasted something I posted recently. (I'd give a link to Google
Groups but the post isn't available on Google Groups -- only about 80% of
Usenet posts are available on Google Groups).
Given the following enumeration type:
enum Day {
Monday,Tuesday,Wednesday,Thursday,
Friday,Saturday,Sunday
};
The names, "Day" and also "Monday", "Tuesday", and so forth are all in
the
same scope. This can be unsatisfactory if you later try to define another
enum:
enum WorkDay {
Monday,Tuesday,Wednesday,Thursday,Friday
};
or if try to define an object:
int Tuesday = 5; /* Name clash! */
I've seen people wrap their enum's in a namespace... but that doesn't
work
out too well (try passing a namespace to a function!). I set about trying
to
find a way to use an enum exactly how I want to, and here's what I've got
so
far. Instead of having:
enum Day { Monday, Tuesday, Wednesday, Thursday,
Friday, Saturday, Sunday };
I have:
struct Day {
enum TheEnumWithin{
Monday,Tuesday,Wednesday,Thursday,
Friday,Saturday,Sunday
} data;
Day() {}
Day( TheEnumWithin const tew ) : data(tew) {}
operator TheEnumWithin&() { return data; }
};
The aim is to use it just like a normal enum, but without the name
clashes.
Sample usage:
bool SomeFunc1( Day d )
{
switch (d)
{
case Day::Monday:
case Day::Wednesday:
case Day::Friday:
return true;
default:
return false;
}
}
int main()
{
Day d;
d = Sunday; /* Won't work! */
d = Day::Sunday;
d = 3; /* Won't work! */
d = Day::TheEnumWithin(3);
SomeFunc1( d ); /* Can pass to function */
}
I only started writing the code within the last half hour, so it's by no
means a finished product! One problem I've just encoutered is dealing
with
const objects of it; specifically, I want to add the following member
function:
operator const TheEnumWithin&() const { return data; }
But then this conflicts with:
operator TheEnumWithin&() { return data; }
Any thoughts?
(If you ask me, there should be a new kind of structure added to C++,
some
sort of enclosed enum.)
I might even use some sort of macro trickery so that I can just write:
EnclosedEnum Day {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
};
-Tom?s
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]