簡體   English   中英

映射/加入兩個自動生成的枚舉的最佳方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM