c++11 将enum转为字符串,将字符串转为enum

   一般用enum有两种情况,一种是string类型方便 “人”读 。一种是int类型,方便机器识别。所以,很多情况,需要把int转为string类型,或者将string转为int类型,方便代码使用。查了很多网页都没发现一个好的实现方式。于是我自己实现了一个。用最少的代码实现int 和 string的绑定关系。

 原理:

        首先,要让编译器能识别,并且有提示,自动填充。这里使用的是类的成员变量来存储int类型,然后用一个map存储string和int的关系。DefCSS 宏展开之后类似如下:

  

public:
    const static int index = __COUNTER__;
private:
    int ii_index = set(index,"index");

        DefCSS2 原理相同       

        __COUNTER__是编译器的一个自增宏定义。

        ii_index 会在该对象初始化的时候调用set,index由于是const static的,所以理论上不占用内存,可以当宏变量使用。public和private的声明只是为了不让别人使用ii_index。ii_index只是为了构造时调用set而定义的变量。

        所以理论上,只需要定义一个对象初始化map,然后释放掉,index和ii_index的关系就存到map中了。在cpp中定义初始化如下:

std::map<std::string, int> CSSExistKey::vk_set;
std::map<int, std::string> CSSExistKey::kv_set;
static CSSExistKey key;//初始化map

        后面的使用就简单了。

int e = CSSExistKey::getKey("index");    //string 转 int
std::string str = CSSExistKey::getValue(e);    //int 转 string
if(CSSExistKey::index == e) ...    //直接当enum使用

  缺点:

        1.由于用到了,定义时构造,所以必须c++11及以上。

        2.不是真正的enum class,不支持编译时类型检测。

使用时发现,const static int 需要在外部定义,否则链接的时候报:未定义的引用。

修改用enum优化如下:

const static int x = __COUNTER__;
//改成 
enum { x = __COUNTER__};

如果编译器实在不支持,可以用支持的编译器进行宏展开。

多个头文件嵌套的时候,可能遇到__COUNTER__不是从0开始,这时候修改如下

enum{BASE = __COUNTER__};
		//#define DefCSS2(x,y) public: static const int x = __COUNTER__; private: int ii_##x = set(x,y);
#define DefCSS2(x,y) public: enum{ x=__COUNTER__ - BASE};private: int ii_##x = set(x,y);
#define DefCSS(x) DefCSS2(x,#x)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值