亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在C ++中使用枚舉作為標志?

如何在C ++中使用枚舉作為標志?

C++
梵蒂岡之花 2019-07-31 18:23:27
如何在C ++中使用枚舉作為標志?將enums作為標志處理可以在C#中通過[Flags]屬性很好地工作,但是在C ++中執行此操作的最佳方法是什么?例如,我想寫:enum AnimalFlags{     HasClaws = 1,     CanFly =2,     EatsFish = 4,     Endangered = 8};seahawk.flags = CanFly | EatsFish | Endangered;但是,我收到關于int/ enum轉換的編譯器錯誤。是否有更好的表達方式而不僅僅是直接的鑄造?優選地,我不想依賴來自第三方庫的構造,例如boost或Qt。編輯:如答案中所示,我可以通過聲明seahawk.flags為避免編譯器錯誤int。但是,我想有一些機制來強制執行類型安全,所以有人不能寫seahawk.flags = HasMaximizeButton。
查看完整描述

3 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

“正確”的方法是為枚舉定義位運算符,如:

enum AnimalFlags{
    HasClaws = 1,
    CanFly =2,
    EatsFish = 4,
    Endangered = 8};inline AnimalFlags operator|(AnimalFlags a, AnimalFlags b){return static_cast<AnimalFlags>(static_cast<int>(a) | static_cast<int>(b));}

等等其他位運算符。如果枚舉范圍超出int范圍,則根據需要進行修改。


查看完整回答
反對 回復 2019-07-31
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

注意(也有點偏離主題):使用位移可以完成另一種制作唯一標志的方法。我,我自己,發現這更容易閱讀。

enum Flags{
    A = 1 << 0, // binary 0001
    B = 1 << 1, // binary 0010
    C = 1 << 2, // binary 0100
    D = 1 << 3, // binary 1000};

它可以將值保持為int,因此在大多數情況下,32個標志清楚地反映在移位量中。


查看完整回答
反對 回復 2019-07-31
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊


對于像我這樣的懶人,這里是復制和粘貼的模板化解決方案:


template<class T> inline T operator~ (T a) { return (T)~(int)a; }

template<class T> inline T operator| (T a, T b) { return (T)((int)a | (int)b); }

template<class T> inline T operator& (T a, T b) { return (T)((int)a & (int)b); }

template<class T> inline T operator^ (T a, T b) { return (T)((int)a ^ (int)b); }

template<class T> inline T& operator|= (T& a, T b) { return (T&)((int&)a |= (int)b); }

template<class T> inline T& operator&= (T& a, T b) { return (T&)((int&)a &= (int)b); }

template<class T> inline T& operator^= (T& a, T b) { return (T&)((int&)a ^= (int)b); }


查看完整回答
反對 回復 2019-07-31
  • 3 回答
  • 0 關注
  • 573 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號