如何识别在C 中的枚举类型中定义某些值

How to identify if the certain value is defined in an enum type in C++?

本文关键字:枚举 类型 定义 何识别 识别      更新时间:2023-10-16

我需要检查在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允许在编译时间初始化和使用矢量或地图,并且还在运行时使用。