Boost logo

Boost :

Subject: Re: [boost] enum / string translation
From: Ross Levine (ross.levine_at_[hidden])
Date: 2009-07-22 01:33:52


How is this different from using a std::map and boost::assign's map_list_of?

On Tue, Jul 21, 2009 at 11:42 PM, Zachary Turner <divisortheory_at_[hidden]>wrote:

> I wrote some code to perform both compile-time and runtime translation
> between enums and their corresponding string values. The only
> direction that isn't possible is string->enum at compile time.
>
> Is there any interest in this? You can use it as follows:
>
> typedef enum { ValueA1, ValueA2 } EnumA;
> typedef enum { ValueB1, ValueB2 } EnumB;
>
> BEGIN_ENUM_MAP_DECLS()
> BEGIN_ENUM_MAP(EnumA, a_map)
> ENUM_MAP(ValueA1) //maps ValueA1 to the string "ValueA1",
> provides both compile-time and run-time lookups.
> ENUM_MAP_NAME(ValueA2, "custom name") //maps ValueA2 to the
> string "custom name", provides both compile-time and run-time lookups
> END_ENUM_MAP()
>
> BEGIN_ENUM_MAP(EnumB, b_map)
> ENUM_MAP(ValueB1)
> ENUM_MAP(ValueB2)
> END_ENUM_MAP()
> END_ENUM_MAP_DECLS()
>
> void foo()
> {
> //value -> string, compile time
> BOOST_STATIC_ASSERT(enum_map<EnumA>::value_lookup[ValueA2] == "custom
> name");
>
> //value -> string, runtime
> EnumB some_value = get_enum_b_from_external_source();
> std::cout << "some_value = " <<
> enum_map<EnumB>::name_lookup[some_value] << std::endl; //prints
> either 'some_value = ValueB1', or 'some_value = ValueB2'
>
> //string -> value, runtime
> EnumA value = enum_map<EnumA>::name_lookup["custom name"];
> BOOST_ASSERT(value == ValueA2);
> }
>
> One particularly useful application of this that I've found is with
> regards to boost::program_options. You can provide an overload of
> boost::program_options::validate that uses boost::enable_if with
> boost::is_enum thus providing automatic support for entry of friendly
> names corresponding to enumerations on the command line or in a config
> file. Obviously there's many other easily identifiable uses as well.
>
> However, this is a common enough problem that I wonder if anyone else
> has already attempted something like this, and if so maybe I can look
> at their code first, or just scrap mine altogether and reuse something
> existing. If not, I'm sure there is plenty of room for improvement in
> mine but if it could fit somewhere in boost (perhaps boost/utility)
> I'd be willing to submit it and make necessary improvements.
>
> Unfortunately I don't think it's technically possible to have a simple
> syntax, even through preprocessor magic, that requires you to only
> specify the name of each enumerated value once, and end up providing
> both a definition of the enumeration as well as the mapping from
> string<->value, but if someone comes up with a way that would
> obviously be ideal.
> _______________________________________________
> 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