Re: How to elegantly get the enum code from its string type
* thomas:
Hi guys,
I got a problem in practice, and I cannot find a verly elegant
solution to it.
------------------------------------------------------------------------
enum Type{
REPLY = 100,
REP = 1052,
HAHA = 9523,
};
Don't use all uppercase for the identifiers (this advice is in most serious
FAQs, including this group's FAQ and Bjarne's mini-FAQ).
Reserve all uppercase for macros, to minimize macro name collisions.
Also, a comma after the last item is accepted by some compilers but relative to
C++98 is a non-standard language extension, so if you desire portability, don't.
------------------------------------------------------------------------
When I open the interface to users for configuration, I would like the
user to use "REPLY", "REP", "HAHA" like string format because it's
much easier to recognize and remember.
Yep.
But in my program, I need to use the actual code (integral format).
My solution is to define a map<string, int>, and insert the string and
integral format pairs into the map for query.
Use a map<string, Type>.
But it's really anoying
and difficult to use, especially when initializing.
Huh?
Is there any elegant solution to this problem?
<code>
#include <string>
#include <stdexcept>
#include <stddef.h>
typedef ptrdiff_t Size;
template< typename T, Size N >
Size size( T (&)[N] ) { return N; }
enum SomeEnum { reply = 100, rep = 1052, haha = 9523 };
SomeEnum someEnumFrom( std::string const& name )
{
typedef std::pair< char const*, SomeEnum > Pair;
static Pair const values[] =
{
Pair( "reply", reply ), Pair( "rep", rep ), Pair( "haha", haha )
};
for( int i = 0; i < size( values ); ++i )
{
if( values[i].first == name ) { return values[i].second; }
}
throw std::runtime_error( "someEnumFrom: no such name" );
}
#include <iostream>
int main()
{
SomeEnum const e = someEnumFrom( "haha" );
std::cout << e << std::endl;
}
</code>
Cheers & hth.,
- Alf