理想情况下,我希望以下示例可以使用,但我想其中一些不能在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 ();
}
我经常使用它们,目前我从头开始编写每一个。 我知道完整的通用解决方案是一个梦想,所以我欢迎任何部分解决方案。 也许有人创建了一个库或代码生成器?
更新1:
答案 0 :(得分:2)
这就是我想到的:
#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;
}
至少它有一些你想要的行为。这缺少了你需要的东西吗?
用g ++ 4.3.3编译,似乎工作正常。
我做了命名空间的事情,将枚举放在不同的范围内。 (所以Red没有被拍摄等等)也许你可以将它解剖成你可以使用的东西? :)
如果你想在该命名空间之外使用Color :: Color,你可以这样做:
typedef Color::Color ColorEnum;
但名称Color很遗憾地被命名空间占用。
答案 1 :(得分:0)
我也讨厌在C ++中实际实现枚举。
我最终滚动自己的模板尝试自动化,但目前并不完全令人满意(特别是因为它需要每个枚举的模板专门化,因此不能用于嵌套在类/结构中的枚举:/)
无论如何,我使用的想法是:
目前我使用了'true'枚举,但是从你所说的我可能会想到有静态实例......虽然它给枚举作者带来了另一个负担......