映射/联接两个自动生成的枚举的最佳方式

Best way to map/join two autogenerated enums

本文关键字:自动生成 两个 枚举 方式 最佳 映射      更新时间:2023-10-16

自动生成的类中加入两个枚举的最佳C++(不是C++11)方法是什么,如下所示:

namespace A {
  namespace B { ...
    class CarInfo {
      public:
      enum State {   // basically same enums defined in different classes
        Running,
        Stopped,
        Broken
      };
    };
    class BikeInfo {
      public:
      enum State {   // basically same enums defined in different classes
        Running,
        Stopped,
        Broken
      };
    };
  }
}

需要的是两个类的统一枚举状态,外部世界可以看到安全类型转换。

我想出的最好,也可能是最直接的方法是创建外部枚举:

enum State {
  Running,
  Stopped,
  Broken
};

连同转换功能

State stateEnumConv(A::B::CarInfo::State aState);
State stateEnumConv(A::B::BikeInfo::State aState);
A::B::CarInfo::State stateEnumConv(State aState);
A::B::BikeInfo::State stateEnumConv(State aState);

需要朝着正确的方法方向前进。

天哪,来自 C 我讨厌到处都是那些长命名空间,我希望它只能是 A::B 级别,就像所展示的示例一样。四个转换函数似乎是多余的,请注意CarInfo::State和BikeInfo::State具有相同的枚举"成员"。

可以使用 typedef 或 alias 声明来引入此类型。

例如

typedef enum {
  Running,
  Stopped,
  Broken
} State;

您可以使用define

#define ToGeneric(vehicleInfoState) ((State) vehicleInfoState)
#define ToSpecialized(vehicleInfo, state) ((A::B::vehicleInfo::State) state)

用法示例:

ToGeneric(car->getState()) // with car->getState() which returns A::B::CarInfo::Running
ToSpecialized(CarInfo, Running)

[编辑]模板版本似乎也可以工作:

template <typename T>
State ToGeneric(typename T::State s) { return static_cast<State>(s); }
template <typename T>
typename T::State ToSpecialized(State s) { return static_cast<typename T::State>(s); }
ToGeneric<A::B::CarInfo>(carInfoState);
ToSpecific<A::B::CarInfo>(state);

但是您每次都必须指定类型(ToGeneric