一般用enum有两种情况,一种是string类型方便 “人”读 。一种是int类型,方便机器识别。所以,很多情况,需要把int转为string类型,或者将string转为int类型,方便代码使用。查了很多网页都没发现一个好的实现方式。于是我自己实现了一个。用最少的代码实现int 和 string的绑定关系。
![](https://img-blog.csdnimg.cn/1afc72e8e6ed42be96312822325cacf5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbTBfNTgxODY2NDg=,size_20,color_FFFFFF,t_70,g_se,x_16)
原理:
首先,要让编译器能识别,并且有提示,自动填充。这里使用的是类的成员变量来存储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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)