是否有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++;要创建强枚举的库? 理想的是,我希望下面的例子能起作用,但我想其中有些是不能在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是痛苦的>即使不再使用,也必须保留旧值,并且只能在末尾添加新值 不可能进行迭代,您需要重新定义运算符 我最终滚动了自己的模板来尝试并实现自动

我经常使用它们,现在我从头开始写每一个。 我知道一个完整的通用解决方案是一个梦想,所以我欢迎任何部分解决方案。 也许有人创建了一个库或代码生成器

更新1:


问题是相关的。我正在调查哪些问题可以用它们来解决。

< P>我也讨厌C++中枚举的实际实现。
  • 自动转换为整型
  • 无值检查:执行松动范围检查,以查看值是否适合选择用于存储它的积分类型
  • 序列化:序列化为int是痛苦的>即使不再使用,也必须保留旧值,并且只能在末尾添加新值
  • 不可能进行迭代,您需要重新定义运算符
我最终滚动了自己的模板来尝试并实现自动化,但目前还不能完全令人满意(特别是因为它需要对每个枚举进行模板专门化,因此不能用于嵌套在类/struct:/中的枚举)

总之,我的想法是:

  • 用于存储值及其“序列化值”的静态映射(在我的示例中,这是一个简单的字符串,因为我不太重视空间,更喜欢可读性)
  • 要包装的类,它只是在映射中保存一个迭代器,“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;