映射/加入两个自动生成的枚举的最佳方法

时间:2013-10-22 15:50:45

标签: c++ enums type-conversion

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

需要采用正确的方法。

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

2 个答案:

答案 0 :(得分:0)

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

例如

typedef enum {
  Running,
  Stopped,
  Broken
} State;

答案 1 :(得分:-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

相关问题