[英]Best way to map/join two autogenerated enums
從自動生成的類連接兩個枚舉的最佳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的Gosh討厭到處都是那些冗長的名稱空間,我希望它只能像所示示例那樣是A :: B級別。 四個轉換函數似乎是多余的,請注意CarInfo :: State和BikeInfo :: State具有相同的枚舉“成員”。
您可以使用typedef或別名聲明來引入此類型。
例如
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
也是如此)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.