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

时间:2015-11-12 21:33:09

标签: c++ enums runtime

我发现了一些与运行时检测相关的有趣发现,这引发了一个有趣的问题。如果我想根据条件声明一个全局变量,我可以在使用#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;

常见陷阱(范围界定):

这是一个常见的陷阱,无法正常工作,因为/ switch条件是作用域的,因此以后无法引用 - 感谢三元运算符!

if(IsConditionTrue())
{
    static const int faveNums[] = {......};
}
else
{
    static const int faveNums[] = {******};
}

问题

然而,情况似乎随着枚举而改变。让我们尝试运行时解决方案,但这次使用枚举:

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

enum faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;

这不会编译。

编译时定义(与第一个示例一样)可以解决这个问题,但有没有办法通过在C ++中有条件地声明全局枚举来在运行时解决这个问题?

2 个答案:

答案 0 :(得分:4)

你不能这样做。要记住的要点:

  1. 可以根据运行时信息以不同方式初始化变量值。
  2. 必须在编译时定义/设置类型。
  3. 您可以使用

    static const int * const faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;
    

    因为它表示使用运行时信息在运行时将faveNums初始化为什么。

    你不能使用

    enum faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;
    

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

答案 1 :(得分:3)

虽然你不能完全按照你的要求做 - 你的数组和枚举示例之间的区别在于数组只是数据,而枚举是一种类型,类型定义必须在编译时可以解析 - 也许更有帮助的答案是这是好的事物。

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