簡體   English   中英

如何在C ++中重用枚舉運算符重載?

[英]How to reuse enum operator overloads in C++?

我在C ++中有幾個類似標志的枚舉。 例如:

enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};
some_state var1;

現在繼續使用&|等位運算符 ,出現編譯器錯誤。 我知道我可以重載operator | 枚舉,但我不想為每個枚舉再次這樣做。 是否有重用運算符重載的好方法?

enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};

int main() {
    some_state var1 = state_normal;
    some_state var2 = state_special;
    unsigned int var3 = var1 | var2;
}

對我來說很好。 沒有重載就不能使用|,&等的原因是因為編譯器無法保證var1 |的結果。 var2是枚舉中的有效值。 如果要采用移位標志,則需要采用整數類型,而不是枚舉類型。 在Direct3D之類的專業標頭中一直使用該屬性。

經過嘗試和搜索,我認為最好的解決方案是#define。 基於我發現的東西

#define FLAGS(T) \
inline T  operator  |(const T s, const T e) { return (T)((unsigned)s | e); } \
inline T &operator |=(T      &s, const T e) { return s = s | e; }            \
inline T  operator  &(const T s, const T e) { return (T)((unsigned)s & e); } \
inline T &operator &=(T      &s, const T e) { return s = s & e; }            \
inline T  operator  ^(const T s, const T e) { return (T)((unsigned)s ^ e); } \
inline T &operator ^=(T      &s, const T e) { return s = s ^ e; }            \
inline T  operator  ~(const T s)            { return (T)~(unsigned)s; }

可以這樣使用:

enum some_state {
  state_normal        = 1 << 0,
  state_special       = 1 << 1,
  state_somethingelse = 1 << 2,
  state_none          = 0,
};
FLAGS(some_state)

some_state var1;

對於Visual Studio,可能需要這樣做來使一些警告靜音:

#pragma warning(disable: 4505) // '*' : unreferenced local function has been removed

實際上,Windows SDK具有DEFINE_ENUM_FLAG_OPERATORS來執行此操作。


另一種方法是使用DEF_ENUM_FLAGS_TYPE這樣的包裝器類。

或者使用類似LLVM_MARK_AS_BITMASK_ENUM 不過,您可能需要使用最新的編譯器。

使用現有的模板庫(例如按位枚舉)提供操作,而不是編寫自己的模板庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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