1

我需要检查是否在枚举类型中定义了某些值,或者在 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
        }
    }
}
4

3 回答 3

0

您正在寻找它称为反射,C++ 不提供此功能,但是有几篇关于此的文章。

此外,新的 C++11 标准引入了一些关于枚举的新内容,使它们更加类型安全,而不仅仅是一个带有值的随机变量。

于 2012-11-13T06:51:39.567 回答
0

有解决方法,但它以boost::fusion的形式出现。这个库的名字来源于它的目的是混合纯编译时模板元编程库boost::mpl和运行时标准模板库

boost::fusion 允许在编译时初始化和使用向量或映射,也可以在运行时使用。

于 2012-11-13T07:31:26.817 回答
0

C++ 没有提供你想要的。

大多数“正确”的解决方案是重新设计整个事物,而不是像这样使用 C++ 枚举。它与 C# enum 不同,它们的不同之处足以让您不应该将它们视为同一事物,就像您认为 union 和 enum 是同一事物一样。清除 C# 解决方案的头脑,设计 C++ 解决方案。

最简单的,特别是如果枚举值不经常改变(如果他们改变,为什么它们是硬编码的枚举?),就是“咬紧牙关”并创建一个具有有效值的集合或映射,当你想要的时候要知道某个数字是否被定义为枚举,测试它是否在集合中,或者您是否还想要名称,然后使用 map 以便您可以将值包含为 int 并将名称包含为字符串。

于 2012-11-13T08:03:08.300 回答