实现C++ 枚举反射机制
来源:互联网 发布:淘宝怎么直播不了 编辑:程序博客网 时间:2024/05/16 07:45
上一阶段写了一些功能需要枚举反射机制,但是C++不支持,很无奈。最近又遇到这个问题,所以自己实现了一版,
自己的版本 枚举定义是 宏定义,其他的都是一些解析
代码如下:
第一次贴代码,也不太会
//enum_map.h头文件
</pre><p><pre name="code" class="cpp">//实现 枚举反射机制/**************************************************************** example:* -----main.cpp** #include "enum_map.h"* //定义枚举:* enum_define( _myEnum,//枚举名称**_A_1dddd3=1000,//枚举值*_A_1dddd32,*_A_1dddd34=11000,*_A_1dddd35=1200,*__sdfsdf_AD_4=0xAdef12,*_Asdfsdfdd=01232* )**//std::string toStringByEnumValue(enum_name,enum_value_int);*//此函数返回枚举string类型*//@enum_name输入枚举名称 必须用上面定义类型定义*//@enum_value_int输入枚举字段实际int值*//returnstring枚举字段名称** //调用* int main()* {*printf("%s\n", toStringByEnumValue(_myEnum, 1300l).c_str());*printf("%s\n", toStringByEnumValue(_myEnum, 1200).c_str());*printf("%s\n", toStringByEnumValue(_myEnum+, 1000).c_str());*return 0;* }***************************************************************************/#ifndef _enum_map_h_h#define _enum_map_h_h#include <stdarg.h>#include <string>#include <map>#include <vector>typedef std::map<int, std::string> enum_map;typedef std::map<std::string, enum_map>enum_map_list;extern enum_map_list all_enum_map_list;std::string TostringByValue(const std::string enum_name, const std::string cs_enum_info, const int enum_value);#define enum_define(enum_name,...)\enum enum_name{\__VA_ARGS__\};\const charenum_str_##enum_name[] = #__VA_ARGS__;#define toString(value_)#value_#define toStringByEnumValue(enum_name,enum_value) TostringByValue(#enum_name,enum_str_##enum_name,enum_value)#endif
//源文件
#include "enum_map.h"#include <stdio.h>enum_map_list all_enum_map_list;//去空格std::string earse_spel(const std::string& str){if (str.empty())return std::string("");std::string tmpStr;for (int i = 0; i < str.length(); i++)if (str[i] != ' ')tmpStr += str[i];return tmpStr;}bool parse_enum_str(const std::string& enum_str, enum_map& enumKeyValueList){std::vector<std::string> enum_value_list;//解析枚举逗号分隔符size_t npos = enum_str.find(",");size_t nlastpos = 0;while (npos != std::string::npos){enum_value_list.push_back(enum_str.substr(nlastpos, npos - nlastpos));nlastpos = npos + 1;npos = enum_str.find(",", static_cast<unsigned int>(nlastpos));}if (nlastpos != enum_str.length()){enum_value_list.push_back(enum_str.substr(nlastpos, enum_str.length() - nlastpos));}if (enum_value_list.size() == 0)return false;//解析单个枚举值对应的名称与值enumKeyValueList.clear();int nDefaultValue = 0;for (std::vector<std::string>::iterator itor = enum_value_list.begin(); itor != enum_value_list.end(); itor++){std::string str_enum_field = earse_spel(*itor);//去空格long nEnumValue;std::string str_enum_field_name;//解析出枚举值对应的名称与值int nPos = str_enum_field.find("=");if (nPos != std::string::npos)//检测是否缺省值{char tmpKeyValue[64] = {'\0'};std::string tmpValue_;str_enum_field_name = str_enum_field.substr(0, nPos - 1);tmpValue_ = str_enum_field.substr(nPos + 1, (*itor).length());sscanf(tmpValue_.c_str(), "%[^LlUu]", tmpKeyValue);//去enum值 后面后缀tmpValue_ = tmpKeyValue;if (tmpValue_.find("0x") != std::string::npos)nEnumValue = strtol(tmpKeyValue, NULL,16);else if(tmpValue_[0] == '0')nEnumValue = strtol(tmpKeyValue, NULL, 8);elsenEnumValue = strtol(tmpKeyValue, NULL, 10);}else{str_enum_field_name = str_enum_field;nEnumValue = nDefaultValue;}nDefaultValue = nEnumValue + 1;enumKeyValueList[nEnumValue] = str_enum_field_name;}if (enumKeyValueList.size() == 0)return false;return true;}std::string TostringByValue(const std::string enum_name, const std::string cs_enum_info, const int enum_value){enum_map_list::iterator itor = all_enum_map_list.find(enum_name);if (itor == all_enum_map_list.end()){enum_map enumKeyValueList;if (!parse_enum_str(cs_enum_info, enumKeyValueList)){return std::string("");}else{all_enum_map_list[enum_name] = enumKeyValueList;}itor = all_enum_map_list.find(enum_name);if (itor == all_enum_map_list.end())return std::string("");}enum_map::iterator it = itor->second.find(enum_value);if (it == itor->second.end())return std::string("");elsereturn it->second;}
0 0
- 实现C++ 枚举反射机制
- c 结构体反射机制实现
- 【Object C】 反射机制
- Objective-C反射机制
- 【C#】:浅谈反射机制
- Object-c反射机制
- 【C#】反射机制
- java利用反射实现Object-c中的KVC机制
- 反射机制的实现
- JavaScript 实现反射机制
- iOS实现反射机制
- iOS实现反射机制
- C++实现反射机制
- C++实现反射机制
- C++实现反射机制
- c++实现反射机制
- C++ 实现反射机制
- C++实现反射机制
- 欢迎使用CSDN-markdown编辑器
- POJ 3041_Asteroids
- n-armed bandit problem
- MongoDB 进阶(GridFS)
- 样式修改时有没有写此项属性与能不能修改对修改类型的影响
- 实现C++ 枚举反射机制
- 报告软件系统性能(9)
- Parcelable接口的使用
- Hadoop map和reduce的个数--map和reduce数量之间的关系是什么
- Python导入matplotlib错误提示ImportError: matplotlib requires pyparsing
- 秒杀系统架构优化思路
- Android GridView控件
- [DevExpress]XtraTabControl右键添加关闭当前页、关闭其他页、全部关闭的实现
- POJ-1287 Networking