亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何輕松地將C ++枚舉映射到字符串

如何輕松地將C ++枚舉映射到字符串

C++
12345678_0001 2019-10-15 14:36:59
我在使用的某些庫頭文件中有一堆枚舉類型,并且我希望有一種將枚舉值轉換為用戶字符串的方法,反之亦然。RTTI不會為我做這件事,因為“用戶字符串”需要比枚舉更具可讀性。暴力解決方案將是一堆類似這樣的函數,但是我覺得這有點像C。enum MyEnum {VAL1, VAL2,VAL3};String getStringFromEnum(MyEnum e){  switch e  {  case VAL1: return "Value 1";  case VAL2: return "Value 2";  case VAL1: return "Value 3";  default: throw Exception("Bad MyEnum");  }}我有一種直覺,認為使用模板是一種優雅的解決方案,但是我還不能完全理解。更新:感謝您的建議-我應該明確指出枚舉是在第三方庫標頭中定義的,因此我不想更改它們的定義。我現在的直覺是避免模板并執行以下操作:char * MyGetValue(int v, char *tmp); // implementation is trivial#define ENUM_MAP(type, strings) char * getStringValue(const type &T) \ { \ return MyGetValue((int)T, strings); \ }; enum eee {AA,BB,CC}; - exists in library header file ; enum fff {DD,GG,HH}; ENUM_MAP(eee,"AA|BB|CC")ENUM_MAP(fff,"DD|GG|HH")// To use...    eee e;    fff f;    std::cout<< getStringValue(e);    std::cout<< getStringValue(f);
查看完整描述

3 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

如果您希望枚舉將自己命名為字符串,請參見這篇文章。否則,a std::map<MyEnum, char const*>會很好地工作。(將字符串文字復制到映射中的std :: strings沒有意義)


對于額外的語法糖,這是編寫map_init類的方法。目標是允許


std::map<MyEnum, const char*> MyMap;

map_init(MyMap)

    (eValue1, "A")

    (eValue2, "B")

    (eValue3, "C")

;

該函數template <typename T> map_init(T&)返回一個map_init_helper<T>。 map_init_helper<T>存儲一個T&,并定義瑣碎的map_init_helper& operator()(typename T::key_type const&, typename T::value_type const&)。(返回*this從operator()允許的鏈接operator(),像operator<<上std::ostreamS)


template<typename T> struct map_init_helper

{

    T& data;

    map_init_helper(T& d) : data(d) {}

    map_init_helper& operator() (typename T::key_type const& key, typename T::mapped_type const& value)

    {

        data[key] = value;

        return *this;

    }

};


template<typename T> map_init_helper<T> map_init(T& item)

{

    return map_init_helper<T>(item);

}

由于函數和幫助程序類是模板化的,因此可以將它們用于任何地圖或類似地圖的結構。即它也可以添加條目到std::unordered_map


如果您不喜歡編寫這些幫助器,則boost :: assign提供了相同的功能。


查看完整回答
反對 回復 2019-10-15
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

自動從另一表格中生成一種表格。


資源:


enum {

  VALUE1, /* value 1 */

  VALUE2, /* value 2 */

};

產生:


const char* enum2str[] = {

  "value 1", /* VALUE1 */

  "value 2", /* VALUE2 */

};

如果枚舉值很大,則生成的表單可以使用unordered_map <>或康斯坦丁建議的模板。


資源:


enum State{

  state0 = 0, /* state 0 */

  state1 = 1, /* state 1 */

  state2 = 2, /* state 2 */

  state3 = 4, /* state 3 */


  state16 = 0x10000, /* state 16 */

};

產生:


template <State n> struct enum2str { static const char * const value; };

template <State n> const char * const enum2str<n>::value = "error";


template <> struct enum2str<state0> { static const char * const value; };

const char * const enum2str<state0>::value = "state 0";

例:


#include <iostream>


int main()

{

  std::cout << enum2str<state16>::value << std::endl;

  return 0;

}


查看完整回答
反對 回復 2019-10-15
  • 3 回答
  • 0 關注
  • 1036 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號