[C/C++] 簡單有用的enum2string宏

來源:互聯網
上載者:User

網路中已經有許多有關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做法參考

  1. http://www.gamedev.net/reference/snippets/features/cppstringizing/
  2. http://stackoverflow.com/questions/207976/how-to-easily-map-c-enums-to-strings
  3. http://stackoverflow.com/questions/2576868/c-c-enums-detect-when-multiple-items-map-to-same-value
  4. http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c
  5. http://www.gamedev.net/community/forums/topic.asp?topic_id=437852
  6. http://www.drdobbs.com/184403744
  7. http://rawr.pastebin.com/D8ryw5qe

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.