我正在尋找使用一組位標誌爲我當前的問題。這些標誌(很好地)被定義爲enum
的一部分,但是我明白,當您從枚舉中得到兩個值時,OR
操作的返回類型的類型爲int
。類型安全枚舉位標誌
什麼目前我正在尋找的是一個解決方案,這將使該位掩碼的用戶保持類型安全,因此我已經創造了operator |
enum ENUM
{
ONE = 0x01,
TWO = 0x02,
THREE = 0x04,
FOUR = 0x08,
FIVE = 0x10,
SIX = 0x20
};
ENUM operator | (ENUM lhs, ENUM rhs)
{
// Cast to int first otherwise we'll just end up recursing
return static_cast<ENUM>(static_cast<int>(lhs) | static_cast<int>(rhs));
}
void enumTest(ENUM v)
{
}
int main(int argc, char **argv)
{
// Valid calls to enumTest
enumTest(ONE | TWO | FIVE);
enumTest(TWO | THREE | FOUR | FIVE);
enumTest(ONE | TWO | THREE | FOUR | FIVE | SIX);
return 0;
}
以下過載這是否超載真正提供類型安全?包含未在枚舉中定義的值的int
是否會導致未定義的行爲?是否有任何警告要注意?
'運營商|(五,六)== 0x30'。什麼ENUM常量的值爲0x30? – Adam
我不會對結果值做任何形式的比較,我只是在檢查標誌。 – ctor
然後OR的結果應該保持爲int。 – Adam