从自动生成的类加入两个枚举的最佳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具有相同的枚举“成员”。
答案 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
)