相同的枚举类,但根据条件不同的定义

时间:2014-02-24 16:50:44

标签: c++ enums

您好我正在尝试在类之外使用枚举但在命名空间内并根据某些条件让它们具有不同的定义。我怎样才能做到这一点? (C ++)

例如像

这样的东西
namespace fruit  {
    if (season) {
      enum eAvailfruit
      {
        apple,
        banana,
        cNumFruit
      };
    } else {
      enum eAvailfruit
      {
        watermelon,
        grape,
        peach,
        cNumFruit
      };
    }
}

有办法吗?

1 个答案:

答案 0 :(得分:4)

一种方法是使用预处理器:

#ifdef SUMMER
enum Fruit {
    // ....
};
#else
enum Fruit {
    // ...
};
#endif

然后以编译器通常喜欢的方式传递编译时常量,例如gcc中的-D标志。

或者,另一方面,不要,因为这是一个可怕的想法。一个略微更好的解决方案可能如下:

enum Season {
    Spring,
    Summer,
    Autumn,
    Winter
};

template <Season S>
struct fruit; // undefined

template <>
struct fruit<Spring>
{
    enum AvailableFruit {
        Banana,
        // etc
    };
};

template <>
struct fruit<Summer>
{
    enum AvailableFruit {
         // etc
    };
};

// etc, specialisations for Autumn and Winter

这些结构与C ++ 11范围的枚举非常类似,因为你可以引用(例如)fruit<Spring>::Banana,但它们是类型安全的,因为引用普通{{1}是非法的},或者甚至只是简单的Banana