網路中已經有許多有關enum2string的討論,做法也多種多樣(見末尾的附錄)。本文也就這個主題描述一個簡單的做法。少說多做,貼代碼為上:
//<br />// enum2string macro definition<br />//<br />#define ENUM_STR_BEGIN(name) /<br />const wchar_t* _get##name(long num) /<br />{ /<br />switch(num) /<br />{<br />#define ENUM_STR_ITEM(e) /<br />case e: return L ## #e;<br />#define ENUM_STR_END /<br />default: return L"<No Value>"; break; /<br />} /<br />return L"<Cannot get here>"; /<br />}<br />// get enum string<br />#define ENUM_STR_GET(name, num) _get##name(num)<br />// enum2string macro<br />#define ENUM2STRING(name, num) ENUM_STR_GET(name, num)<br />
使用時先定義enum到string的轉換,套路如下:
ENUM_STR_BEGIN(enum_typename)<br /> ENUM_STR_ITEM(enum_value)<br />ENUM_STR_END
例子:(WMPPlayState是wmp中定義的枚舉類型)
ENUM_STR_BEGIN(WMPPlayState)<br /> ENUM_STR_ITEM(wmppsUndefined )<br /> ENUM_STR_ITEM(wmppsStopped )<br /> ENUM_STR_ITEM(wmppsPaused )<br /> ENUM_STR_ITEM(wmppsPlaying )<br /> ENUM_STR_ITEM(wmppsScanForward )<br /> ENUM_STR_ITEM(wmppsScanReverse )<br /> ENUM_STR_ITEM(wmppsBuffering )<br /> ENUM_STR_ITEM(wmppsWaiting )<br /> ENUM_STR_ITEM(wmppsMediaEnded )<br /> ENUM_STR_ITEM(wmppsTransitioning)<br /> ENUM_STR_ITEM(wmppsReady )<br /> ENUM_STR_ITEM(wmppsReconnecting )<br /> ENUM_STR_ITEM(wmppsLast )<br />ENUM_STR_END
在定義之後就可以使用了,套路如下:
const wchar_t* desc = ENUM2STRING(enum_typename, enum_value);<br />
具體例子:
void CWMPEventSink::PlayStateChange(long NewState)<br />{<br />const wchar_t* desc = ENUM_STR_GET(WMPPlayState, NewState);<br />ATLTRACE(L"CWMPEventSink::PlayStateChange NewState: %d, %s/n", NewState, desc);<br /> return;<br />}<br />
小結:本文給出一個簡單的enum2string的做法。還有一個需求是string2enum,即根據string名稱獲得對應的enum值,讀者可練習自己定義。值得一提的是Java的Enum類型本身就有這個特性。在新的C++0x中將引入強枚舉類型(Strongly typed enumerations),不再允許自動到int類型的轉換,不過貌似仍然不支援enum2string。
附錄:其它enum2string做法參考
- http://www.gamedev.net/reference/snippets/features/cppstringizing/
- http://stackoverflow.com/questions/207976/how-to-easily-map-c-enums-to-strings
- http://stackoverflow.com/questions/2576868/c-c-enums-detect-when-multiple-items-map-to-same-value
- http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c
- http://www.gamedev.net/community/forums/topic.asp?topic_id=437852
- http://www.drdobbs.com/184403744
- http://rawr.pastebin.com/D8ryw5qe