如何识别在C 中的枚举类型中定义某些值
How to identify if the certain value is defined in an enum type in C++?
我需要检查在C 中运行时未定义某些值。该要求可以通过C#轻松完成(请参阅以下代码)。但是C 在运行时没有类型的信息(据我所知)。有没有办法解决方法?
ps:在我的项目中,枚举类型定义了数百个值,因此我不想复制源代码中的值(例如,创建映射并将所有有效值推入其中),以实现增加增加的逻辑可维护性的复杂性。
enum BoFormObjectEnum
{
fo_Items = 4,
fo_SalesEmployee = 53,
fo_TransactionTemplates = 55,
fo_JournalPosting = 30,
fo_CheckForPayment = 57,
fo_PaymentTermsTypes = 40,
...
}
class Program
{
static void Main(string[] args)
{
var array = Enumerable.Range(1, 60);
foreach (var item in array)
{
if (Enum.IsDefined(typeof(BoFormObjectEnum), item))
// do some logic
else
// do some other logic
}
}
}
c 不提供您想要的东西。
最"适当"的解决方案是重新设计整个过程,而不是使用C 枚举。它与C#枚举不同,它们与众不同,您不应该将它们视为同一件事,比您认为联合和枚举是同一件事的更多。清除C#解决方案,设计C 解决方案的想法。
最简单,尤其是如果枚举值不经常更改(如果这样做,为什么它们是硬编码的枚举?)当您想知道某个数字是否定义为枚举时,测试它是否在集合中,或者是否也需要该名称,然后使用地图,以便将值同时包含为int和name as string。
您正在寻找的内容称为反射,C 不提供此功能,但是有几篇文章。
新的C 11标准也引入了有关枚举的新内容,使其更加安全,而不仅仅是具有值的随机变量。
有解决方法,但是它的冗长以boost :: fusion的形式出现。该库的名称源于其作为纯编译时模板元编程库Boost :: MPL和运行时标准模板库的混合体的目的。
boost :: Fusion允许在编译时间初始化和使用矢量或地图,并且还在运行时使用。
相关文章:
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 如何注册枚举类型到QJSEngine,以便在脚本环境中使用?
- 通过包装器从 C 访问C++ API 时,如何访问枚举类型
- C++/错误:表达式必须具有整数或无作用域枚举类型
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 在类访问混淆中声明的枚举类型
- 在枚举类型上使用std::max是不是一种糟糕的做法
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 是否可以使用泛型枚举类型作为函数的参数?
- Visual Studio 2017 生成工具与枚举类型的问题
- 使用枚举类型管理存储顺序
- 如何检查类中定义的枚举类型变量是否被分配给?
- 如何从枚举类型中获取枚举值?
- 为什么C++不为枚举类型提供默认"operator>>"函数?
- 确保枚举类型的键/值在软件Revs之间永远不会更改
- MSVC 1 位枚举类型等于 -1,并且相等性测试失败
- 我们可以专业化类模板的枚举(类型)成员吗?
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- 枚举类型的重载>>运算符(工作日)
- C 中的枚举类型字符串类别