【发布时间】:2012-11-13 06:44:53
【问题描述】:
我需要在 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# 有一个创可贴帮助人们做出如此糟糕的设计)。
-
另一个使用包装类的好理由,或者这个 Boost 非官方扩展枚举:github.com/boost-vault/Miscellaneous(文件名为 enum_rev4.6.zip)