0

从自动生成的类中加入两个枚举的最佳 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);

需要正确的方法。

来自 CI 的天哪,讨厌无处不在的长命名空间,我希望它只能是 A::B 级别,就像在展示的示例中一样。四个转换函数似乎是多余的,注意 CarInfo::State 和 BikeInfo::State 具有相同的枚举“成员”。

4

2 回答 2

0

您可以使用 typedef 或别名声明来引入此类型。

例如

typedef enum {
  Running,
  Stopped,
  Broken
} State;
于 2013-10-22T15:55:43.303 回答
-1

您可以使用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也)

于 2013-10-22T16:15:13.040 回答