gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:15:45 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com