是否有C++;要创建强枚举的库? 理想的是,我希望下面的例子能起作用,但我想其中有些是不能在C++中实现的。 { typedef StrongEnum<Red=0, Green=1, Blue=2> Color; // not a C++ syntax Color c = Color::Red; // static const Color d; //error: default constructor is private Color d = c; Color e = Color::OfInt(5); // ifdef DEBUG - Runtime error: Enum out of range int sum = 0; // I do have these macros, but separate for each enum - FOREACH_COLOR(c) FOREACH_ENUM (Color c) { sum += c.ToInt (); } ArrayMap<Color, string> map; // Internally this is const size array, possible map [Color::Red] = "red"; // because Color have static const Limit = 3 inisde. // Advanced: EnumPair does bitpacking. // currently I implement it manually for every pair of Enum's I need. typedef EnumPair <door=Color, window=Color> ColorPair; // I guess I can't get this, can I? ColorPair pair (door = Color::Red, window = Color::Green); // I guess I can't give the labels here or one line above, can I? Color w = pair.window; Color w = pair.window (); } { TyPulfStuteNeNo.///C++语法 颜色c=颜色::红色;//静态常量 颜色d;//错误:默认构造函数是私有的 颜色d=c; Color e=Color::OFIT(5);//ifdef调试-运行时错误:枚举超出范围 整数和=0; //我有这些宏,但每个枚举都是单独的-FOREACH_颜色(c) FOREACH_ENUM(颜色c){ sum+=c.ToInt(); } ArrayMap;//内部这是常量大小的数组,可能是 map[Color::Red]=“Red”//因为颜色的静态常量限制为3英寸。 //高级:枚举对不进行位打包。 //目前,我为我需要的每一对Enum手动实现它。 typedef EnumPair ColorPair;//我想我买不到这个,是吗? 颜色对(门=颜色::红色,窗=颜色::绿色);//我想我不能在这里或上面一行给出标签,可以吗? 颜色w=成对窗口; Color w=pair.window(); }
我经常使用它们,现在我从头开始写每一个。 我知道一个完整的通用解决方案是一个梦想,所以我欢迎任何部分解决方案。 也许有人创建了一个库或代码生成器 更新1:是否有C++;要创建强枚举的库? 理想的是,我希望下面的例子能起作用,但我想其中有些是不能在C++中实现的。 { typedef StrongEnum<Red=0, Green=1, Blue=2> Color; // not a C++ syntax Color c = Color::Red; // static const Color d; //error: default constructor is private Color d = c; Color e = Color::OfInt(5); // ifdef DEBUG - Runtime error: Enum out of range int sum = 0; // I do have these macros, but separate for each enum - FOREACH_COLOR(c) FOREACH_ENUM (Color c) { sum += c.ToInt (); } ArrayMap<Color, string> map; // Internally this is const size array, possible map [Color::Red] = "red"; // because Color have static const Limit = 3 inisde. // Advanced: EnumPair does bitpacking. // currently I implement it manually for every pair of Enum's I need. typedef EnumPair <door=Color, window=Color> ColorPair; // I guess I can't get this, can I? ColorPair pair (door = Color::Red, window = Color::Green); // I guess I can't give the labels here or one line above, can I? Color w = pair.window; Color w = pair.window (); } { TyPulfStuteNeNo.///C++语法 颜色c=颜色::红色;//静态常量 颜色d;//错误:默认构造函数是私有的 颜色d=c; Color e=Color::OFIT(5);//ifdef调试-运行时错误:枚举超出范围 整数和=0; //我有这些宏,但每个枚举都是单独的-FOREACH_颜色(c) FOREACH_ENUM(颜色c){ sum+=c.ToInt(); } ArrayMap;//内部这是常量大小的数组,可能是 map[Color::Red]=“Red”//因为颜色的静态常量限制为3英寸。 //高级:枚举对不进行位打包。 //目前,我为我需要的每一对Enum手动实现它。 typedef EnumPair ColorPair;//我想我买不到这个,是吗? 颜色对(门=颜色::红色,窗=颜色::绿色);//我想我不能在这里或上面一行给出标签,可以吗? 颜色w=成对窗口; Color w=pair.window(); },c++,enums,c++11,C++,Enums,C++11,我经常使用它们,现在我从头开始写每一个。 我知道一个完整的通用解决方案是一个梦想,所以我欢迎任何部分解决方案。 也许有人创建了一个库或代码生成器 更新1: 问题是相关的。我正在调查哪些问题可以用它们来解决。< P>我也讨厌C++中枚举的实际实现。 自动转换为整型 无值检查:执行松动范围检查,以查看值是否适合选择用于存储它的积分类型 序列化:序列化为int是痛苦的>即使不再使用,也必须保留旧值,并且只能在末尾添加新值 不可能进行迭代,您需要重新定义运算符 我最终滚动了自己的模板来尝试并实现自动
问题是相关的。我正在调查哪些问题可以用它们来解决。< P>我也讨厌C++中枚举的实际实现。
- 自动转换为整型
- 无值检查:执行松动范围检查,以查看值是否适合选择用于存储它的积分类型
- 序列化:序列化为int是痛苦的>即使不再使用,也必须保留旧值,并且只能在末尾添加新值
- 不可能进行迭代,您需要重新定义运算符
- 用于存储值及其“序列化值”的静态映射(在我的示例中,这是一个简单的字符串,因为我不太重视空间,更喜欢可读性)
- 要包装的类,它只是在映射中保存一个迭代器,“end”表示未初始化/无效的值
目前我使用的是'true'枚举,但根据您所说的,我可能会想到使用静态实例。。。尽管这给enum编写器带来了另一个负担…这就是我所发现的:
#include <cstdio>
#include <string>
#include <map>
namespace Color
{
typedef enum
{
Red = 0,
Green = 1,
Blue = 2
} Color;
Color colors[] = {Red, Green, Blue}; // same order as above,
//to preserve index.
//int colors_len = sizeof(colors)/sizeof(Color);
// (if you want to check for valid values)
static inline Color OfInt(int value)
{
// if(value >= colors_len) do error thing;
return colors[value];
}
}
int main()
{
Color::Color c = Color::Red;
printf("%d,", c);
c = Color::OfInt(1);
printf("%d,", c);
c = Color::Blue;
printf("%d\n", c);
std::map<Color::Color, std::string> map;
map[Color::Red] = "red";
return 0;
}
但是名称Color不幸被名称空间占用。但是partial并不意味着实现上面的Color类。这意味着使用部分泛型枚举以避免重复实现相同的方法。您是否在寻找安全的标签?是的,我知道C++0x中的enum类,但它本身并不能解决我的问题。我想他想要一些能够自动化这个过程的东西(例如:颜色、季节等)。我没有以一种可以扩展的方式使用宏。我会使用上面的解决方案,手动编写它们。如果他需要的话,他可以用python或者其他东西编写一个脚本来快速创建那个文件,但我不确定这是否值得。
typedef Color::Color ColorEnum;