不同类型的类成员,每个枚举变体一个

Class members of different types, one for each enum variand

本文关键字:一个 枚举 成员 同类型      更新时间:2023-10-16

我有一个这样的枚举:

enum Field {
    Foo,
    Bar,
    Baz,
    // 50 more follow
}

我想将一些数据类型与每个值(Foo - uint、Bar - 字符串等)相关联,并且我想为每个枚举值创建一个带有字段的类,该值的类型与此枚举相关联。我还想有一个通用的 getter/setter,它允许对字段组进行原子操作。

有没有办法以通用的方式完成所有这些工作 - 避免每个字段的专用方法,但保留我想要的所有类型安全性?如果是这样,该怎么做?

老实说,如果你要这样做,你可能希望通过两种方式做到这一点:

1) 创建一个新类。

如果要在公共类之间共享 50 个左右的字段,则不妨创建一个公共类或结构来保存数据。

2) 使用std::map<variant/enum, value>

对我来说,如果你真的想以牺牲性能为代价创建一个灵活的系统,你可以使用 std::map/std::unordered_map 来实现一个键/值系统。Boost.Variant 有一个很好的实现,允许各种变体类型充当更高级的枚举。如果将其用作键,则可以确定映射将仅具有枚举数量的类型,并且仍然保持类型安全。只是要注意这样做的问题。

我不知道

有任何纯粹的C++解决方案可以满足您的所有要求。由于缺乏类型安全性,运行时强制转换不适合您,而 (AFAIK) 无法在编译时迭代枚举,此外,为每个项目生成一个类成员。即使有一些超级复杂的基于模板的方法,在我看来,编写一些可以从枚举生成C++代码的脚本将更加简单和灵活,以实现您想要的。