いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

enum string

C/C++には、なーんで enum -> string が出来ないんだろうか…と思う。 string -> enum はともかく。(あったらあったで便利だけど。)
まぁ、思ったところで何も解決しないので、どーにかして自前で実装しなきゃいけないわけです。

でー、どうしようかなーと、布団でゴロゴロぬくぬくしながら考えていた時、ふと思ったのです。 C/C++の文字列の型って、const char* じゃないですか。 つまり定数。 …定数とくればこんな事が可能……ッ!?

enum MyChar
{ // 文字列リテラルのアドレスをenum value として使用。
  MC_Misya  = reinterpret_cast<int>("MOE_Misya"),
  MC_Manna = reinterpret_cast<int>("MOE_Manna"),
  MC_Laura  = reinterpret_cast<int>("MOE_Laura"),
};

アドレスであれば、まずユニークな値が取得できるはず!同じアドレスだったら、同じ文字列が取得出来ちゃいますからね。
こうしておけば、

// MC_Misya と出力
printf("%s", (char*)MC_Misya);

としてコーディングが可能になるではありませんか!! enum値がすでにその文字列への値になっているわけですから!!
ぅぉぉ、こりゃ、キターーーーーーー………!?!?


……コンパイルエラーでした
。orz

…落ち着いて考えてみれば、当たり前ですよねー。文字列が格納されるメモリ空間なんてのは、実行時にしかわかりませんから…。第一 const char* であって const char* const じゃないし。orz

そんなこんなで結局

// enum 定義
enum MyChar
{
  MC_Misya,
  MC_Manna,
};

#define D_EnumString(v)  v, #v
struct S9EnumString
{
  int          nValue;
  LPCTSTR szString;
};

const S9EnumString aes[] =
{
   D_EnumString(MC_Misya),
   D_EnumString(MC_Manna),
};

として、aes を for でぐるぐる回して探す形になりましたとさ……。う〜ん。^^;