C++ 在运行时有条件地声明枚举(C+;+;)

C++ 在运行时有条件地声明枚举(C+;+;),c++,enums,runtime,C++,Enums,Runtime,我遇到了一些与运行时检测相关的有趣发现,这引发了一个有趣的问题。如果我想根据条件声明一个全局变量,我可以在使用#ifdefs预编译期间轻松地进行声明。然而,这会产生不同的二进制文件,我正在寻找一种可以在运行时实现的解决方案,以便将行为约束到单个二进制文件 例子 我可以使用数组或其他数据类型执行的一个经典示例(注意,这里的数据类型都是const,并且必须保持不变-镜像枚举的不可变行为): 原始(编译时): #ifdef CONDITION static const int faveNums[] =

我遇到了一些与运行时检测相关的有趣发现,这引发了一个有趣的问题。如果我想根据条件声明一个全局变量,我可以在使用
#ifdefs
预编译期间轻松地进行声明。然而,这会产生不同的二进制文件,我正在寻找一种可以在运行时实现的解决方案,以便将行为约束到单个二进制文件

例子 我可以使用数组或其他数据类型执行的一个经典示例(注意,这里的数据类型都是
const
,并且必须保持不变-镜像枚举的不可变行为):

原始(编译时):

#ifdef CONDITION
static const int faveNums[] = {......};
#else
static const int faveNums[] = {******};
#endif
static const int conditonalFaveNums[] = {......};
static const int defaultFaveNums[] = {******};

static const int * const faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;
已修改(运行时):

#ifdef CONDITION
static const int faveNums[] = {......};
#else
static const int faveNums[] = {******};
#endif
static const int conditonalFaveNums[] = {......};
static const int defaultFaveNums[] = {******};

static const int * const faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;
常见陷阱(范围界定):

#ifdef CONDITION
static const int faveNums[] = {......};
#else
static const int faveNums[] = {******};
#endif
static const int conditonalFaveNums[] = {......};
static const int defaultFaveNums[] = {******};

static const int * const faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;
这是一个常见的陷阱,不会起作用,因为/switch条件的作用域是有限的,因此以后无法引用-谢天谢地,三元运算符

if(IsConditionTrue())
{
    static const int faveNums[] = {......};
}
else
{
    static const int faveNums[] = {******};
}
问题 然而,这种情况似乎随着枚举而改变。让我们尝试运行时解决方案,但这次使用枚举:

enum conditionalFaveNums = {......};
enum defaultFaveNums = {******};

enum faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;
这将无法编译


< > >编译时定义(与第一个示例一样)可以解决这个问题,但是在C++中有条件通过在C++中有条件声明全局枚举来解决这个问题吗?< /强>

< p>您不能这样做。要记住的要点:

  • 变量的值可以根据运行时信息进行不同的初始化
  • 类型必须在编译时定义/设置
  • 你可以用

    static const int * const faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;
    
    因为这说明了在运行时使用运行时信息初始化faveNums

    你不能使用

    enum faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;
    

    因为它试图使用运行时信息定义类型
    faveNums

    虽然您不能完全按照要求执行操作,但数组和枚举示例之间的区别在于数组只是数据,而枚举是类型,类型定义必须在编译时解析——也许更有用的答案是这是一件好事


    动态数据应该用动态数据结构表示
    std::set
    与枚举在概念上非常接近,它提供了许多有用(且高效)的方法,以后可能会派上用场。更好的方法可能是定义一个枚举,列出编译时所有可能的值,然后根据运行时信息动态构建这些值的
    集。(因此,集合是枚举范围的适当子集。)

    对不起,没有办法。很好的替代方案!