实现类似C#语言的枚举

AWolfBoy 2007-06-19 05:58:32
#include <cstdlib>
#include <iostream>

using namespace std;

#define ENUMERATION(ENUMTYPE, VALUE) \
enum ENUMTYPE##_ {VALUE}; \
struct ENUMTYPE##Struct \
{ \
ENUMTYPE##_ key; \
char value[128]; \
}; \
ENUMTYPE##Struct ENUMTYPE##List[] = {{VALUE, #VALUE}}; \
class ENUMTYPE \
{ \
public: \
ENUMTYPE(ENUMTYPE##_ value) \
{ \
value_ = value; \
} \
ENUMTYPE& operator=(ENUMTYPE##_ value) \
{ \
value_ = value;\
return *this; \
} \
operator int() \
{ \
return value_; \
} \
const char* c_str() const \
{ \
return ENUMTYPE##List[value_].value;\
} \
private: \
ENUMTYPE##_ value_; \
}

ENUMERATION(COLOR, RED);

int main(int argc, char *argv[])
{
COLOR c = RED;
cout << c << ":" << c.c_str();

//system("PAUSE");
return EXIT_SUCCESS;
}

输出: 0:RED
上面通过一个枚举结构数组,实现了类似C#语言的枚举

不过上面的实现方法相当的不优雅,我的想法是实现类似BOOST库的Function方式的
Enum<Color (RED, BLACK, WHITE)> c;
c = Color::RED;
c = 1;
c = "RED";

std::cout << c << ":" << c.c_str() << "\n";

目前还没有想到怎么来实现,仅仅是一个想法,希望大家能给我提供点意见.
我想如果C++的枚举值如果能达到像上面说的,那一定是非常爽的
...全文
237 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
AWolfBoy 2007-06-20
  • 打赏
  • 举报
回复
C#的enum特性就像一个类,直接支持枚举值与文本描述,大概和我下面说的功能相似
Enum<Color (RED, BLACK, WHITE)> c;
c = Color::RED;
c = 1;
c = "RED";

std::cout << c << ":" << c.c_str() << "\n";

taodm 2007-06-20
  • 打赏
  • 举报
回复
C#里的enum啥特性?
taodm 2007-06-20
  • 打赏
  • 举报
回复
不可能一样自然。模拟的东西基本上怎么也比不上语言内建支持。
也没必要搞到如此自然。要寻取合适的折中点。
建议不要在这些东西上花太多时间。
决定软件质量的最重要因素是架构。语法上的小花样,对大局没有太多价值。
AWolfBoy 2007-06-20
  • 打赏
  • 举报
回复
通用的enum->string的对应表吗?
主要我只是想让它用得像C#里面有ENUM一样自然,不仅仅是单单的字符串到枚举值的转换
taodm 2007-06-20
  • 打赏
  • 举报
回复
只要把c.c_str() 改成c_str(c),用C++实现这个功能也不是很困难了,利用宏建一个enum->string的对应表即可。
没必要一定要把enum升级成类。enum与int间的转换关系将成为那个类的2义性隐患。
AWolfBoy 2007-06-19
  • 打赏
  • 举报
回复
不能提前,就自已顶一把吧
huashizhixin 2007-06-19
  • 打赏
  • 举报
回复
没用过
不晓得
AWolfBoy 2007-06-19
  • 打赏
  • 举报
回复
应该不行吧, BOOST中的FUNCTION, LAMBA的实现和我要求的方式挺像的
  • 打赏
  • 举报
回复
loki 的 typelist
boost::mpl::vector
不知道能不能

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧