【问题标题】:Class members of different types, one for each enum variand不同类型的类成员,每个枚举变体一个
【发布时间】:2015-06-18 22:14:33
【问题描述】:

我有一个这样的枚举:

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

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

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

【问题讨论】:

  • “有没有办法以通用的方式完成所有这些工作” 是的。我们的生产代码中有这样的东西。
  • 举个例子来说明你想要完成的事情以及一个用例。
  • 我能告诉你这么多,代码是基于使用类似std::map<Field,AbstractValueTypeWrapper>的东西。
  • @πάνταῥεῖ:是的,我应该知道这里的人会从字面上理解这个问题,给出一个二进制答案,没有任何解释如何实际做到这一点......现在要编辑。
  • @πάνταῥεῖ(第二篇文章):我不能使用 AbstractValueTypeWrapper,因为它需要类层次结构中的共同祖先 + RTTI 进行向下转换(两者都不是可能),或者完全不安全的转换问题,因为这会导致比它解决的问题更多的问题。

标签: c++ templates enums


【解决方案1】:

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

1) 创建一个新类。

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

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

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

【讨论】:

  • 1) 创建一个新类是很容易的部分。将其字段映射到枚举要困难得多,而我实际上在这里问的是什么。 2) boost::variant 消除了对枚举的需要,但同时消除了我从此类枚举中获得的所有收益-例如,以任意组合一次原子地更新多个字段,为此我需要 enum->mutex 映射.
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多