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