[英]Checking whether a scoped enum contains a value
我還沒有看到關於枚舉的這個問題的明確答案。 可以說我有一個枚舉:
enum class TileType
{
WALL= 'W',
PASSAGE= 'P',
MONSTER = 'M',
CRYSTAL= 'C',
};
我想使用 char 進行類型轉換並創建一個新的枚舉讓我們說輸入 char 在枚舉中是未定義的:
char id = 'A';
現在,當我對它進行類型轉換時,會出現未定義的行為:
TileType type = static_cast<TileType>(id);
這就是為什么我想檢查 id 是否是枚舉的有效值
//check if enum contains id
bool checkID(char id){...}
現在我有幾個想法可以做到,但它們對我來說似乎太過分了。 我也找不到一種方法來遍歷枚舉 class 以簡化檢查,但我認為這是不可能的。
有沒有一種方法可以輕松檢查枚舉是否包含 id,以便我可以決定是否可以進行類型轉換? 還是我應該像 switch 語句一樣檢查每個案例?
還是我應該像 switch 語句一樣檢查每個案例?
這可能是一個不錯的解決方案。 像這樣:
switch(id) {
case char(TileType::WALL):
case char(TileType::PASSAGE):
case char(TileType::MONSTER):
case char(TileType::CRYSTAL):
return true;
default:
return false;
}
另一種方法是將所有有效值存儲在數據結構中,例如數組:
constexpr std::array valid {
char(TileType::WALL),
char(TileType::PASSAGE),
char(TileType::MONSTER),
char(TileType::CRYSTAL),
};
使用這樣的數據結構,您可以像這樣檢查有效性:
return std::ranges::find(valid, id) != valid.end();
編譯器往往更擅長優化開關。
在任何一種情況下,使用元編程來生成開關/數組都可能很有用。
沒有標准的方法可以做到這一點。 一種方法是使用像magic_enum這樣的第三方庫,它可能仍然對枚舉的范圍有限制。
enum class TileType
{
WALL= 'W',
PASSAGE= 'P',
MONSTER = 'M',
CRYSTAL= 'C',
};
bool contains = magic_enum::enum_contains<TileType>('A');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.