是否有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 ();
}

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

更新1:

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

最佳答案 这就是我想到的:

#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很遗憾地被命名空间占用.

点赞