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

标签 c++ enums runtime

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

例子

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

原始(编译时):

#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;

常见陷阱(范围界定):

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

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

问题

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

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

enum faveNums = IsConditionTrue() ? conditonalFaveNums : defaultFaveNums;

这不会编译。

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

最佳答案

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

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

关于c++ - 在运行时有条件地声明枚举 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33681817/

相关文章:

c++ - Direct3D 9.0 交错非 fvf 顶点缓冲区

c# - 如何声明嵌套枚举?

python - 将 C 枚举位域转换为 Python

c# - 为什么将存储在对象中的枚举转换为 int 会返回一个字符串?

C、运行时测试 PATH 中是否存在可执行文件

android - Dalvik 字节码跟踪器

c++ - Unresolved external 错误 - 使用 FTD2XX.h 的 Visual C++

c++ - 使用 cmake 将 Eigen 库添加到 C++ 项目

C++ 检查整数。

Python:如何在运行时获取实例的名称?