簡體   English   中英

檢查作用域枚舉是否包含值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM