我有這個:
enum class Categories : uint32_t {
C6 = 0x00000020,
C7 = 0x00000040,
C8 = 0x00000080,
...
};
我選擇了一個列舉類,因為它非常適合進行范圍界定。但缺點是,當我需要將類別用作按位運算的掩碼位時,我需要先將它們轉換為 uint32_t。
例子:
uint32_t masterCat = ((uint32_t)MyClass::Categories::C6) | ((uint32_t)MyClass::Categories::C7);
有沒有一種方法可以獲得相同的范圍優勢,而不必每次使用前都進行轉換?如果我使用常規列舉,那么我就失去了范圍界定的好處:(
例子:
uint32_t masterCat = (MyClass::Categories::C6) | (MyClass::Categories::C7);
uj5u.com熱心網友回復:
將其拆分enum class為 anenum和 a class(或struct為方便起見)。
struct Categories {
enum : uint32_t {
C6 = 0x00000020,
C7 = 0x00000040,
C8 = 0x00000080,
};
};
由于enum是嵌入式型別,您需要指定Categories訪問它,如Categories::C6.
如果這是在另一個類中,例如
class MyClass {
public:
struct Categories {
enum : uint32_t {
C6 = 0x00000020,
C7 = 0x00000040,
C8 = 0x00000080,
};
};
};
那么您可以使用MyClass::Categories::C6來參考列舉之一,但既不作業MyClass::C6也不行C6。
uj5u.com熱心網友回復:
如果您想使用按位并仍然禁止轉換為其基礎型別,那么您可能會添加函式,因此故意只執行一次強制轉換:
enum class Categories : std::uint32_t {
C6 = 0x00000020,
C7 = 0x00000040,
C8 = 0x00000080,
//...
};
constexpr /*Categories*/ std::uint32_t operator | (Categories lhs, Categories rhs)
{
return /*Categories*/(std::uint32_t(lhs) | std::uint32_t(rhs));
}
// operator& ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371698.html
上一篇:如何使`std::is_empty_v<T>&&sizeof(T)>1`為真的型別T?
下一篇:從二維向量獲取輸入時出現分割錯誤
