C++ 相同的枚举类,但不同的定义取决于条件

C++ 相同的枚举类,但不同的定义取决于条件,c++,enums,C++,Enums,嗨,我正试图让枚举在类之外,但在名称空间内,并让它们根据某些条件有不同的定义。我怎样才能做到这一点?C++ 举个例子 namespace fruit { if (season) { enum eAvailfruit { apple, banana, cNumFruit }; } else { enum eAvailfruit { watermelon,

嗨,我正试图让枚举在类之外,但在名称空间内,并让它们根据某些条件有不同的定义。我怎样才能做到这一点?C++

举个例子

namespace fruit  {
    if (season) {
      enum eAvailfruit
      {
        apple,
        banana,
        cNumFruit
      };
    } else {
      enum eAvailfruit
      {
        watermelon,
        grape,
        peach,
        cNumFruit
      };
    }
}

有办法吗

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

#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::Banana,但它们是类型安全的,因为仅引用纯香蕉,甚至仅引用纯可用柚子都是非法的。

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

#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::Banana,但它们是类型安全的,因为仅引用纯香蕉,甚至仅引用纯可用柚子都是非法的。

我想如果season是编译时常量,而不是其他。条件的作用域是什么,季节?但您将如何处理使用枚举的代码?例如,如果你有提到香蕉的代码,那么当季节为假时会发生什么呢?这听起来像是一个BAAAD设计理念。可能是XY问题,您实际上要解决什么问题?@user2134081引用香蕉的所有代码在整个代码中都将处于if-seasure状态,听起来您将有很多重复代码。如果seasure是编译时常量,我想是这样,但不是其他情况。条件的范围是什么,季节?但您将如何处理使用枚举的代码?例如,如果你有提到香蕉的代码,那么当季节为假时会发生什么呢?这听起来像是一个BAAAD设计理念。可能是XY问题,您实际上要解决什么?@user2134081引用香蕉的所有代码在整个代码中都将处于if季节,听起来您将有大量重复代码。