簡體   English   中英

確保覆蓋地圖中的所有枚舉值

[英]Ensuring coverage for all enum values in map

說我有以下內容:

#include <map>

enum class Thing {Zero, One, Two};

class Metadata {};

std::map<Thing, Metadata> extra_info;

void foo() {
    extra_info[Thing::Zero] = Metadata();
    extra_info[Thing::One] = Metadata();
    extra_info[Thing::Two] = Metadata();
}

我想確保在添加新標簽的情況下,在extra_info中考慮Thing所有標簽,例如Thing::Three

我認為最后總是有一個標簽, LastTag ,並從0迭代到LastTag - 2並驗證這些鍵是否存在於地圖中,但這看起來很糟糕。 在編譯時實現這一點的方法是最好的,但我可以看到這根本不可能。

在C#中,使用反射獲取所有枚舉值,然后迭代這些值是一件簡單的事情。 我認為這說明我無法用C ++標簽找到答案,但我可以找到Java和C#的答案......這讓我覺得這是不可能的。

枚舉中的Sentinel值已成為許多項目的一部分,用於指示枚舉值的數量或從系統定義的枚舉用戶可用枚舉的范圍。

在您的情況下,您可以利用地圖具有唯一鍵並添加標記值(嚴格地說不是枚舉的一部分)的事實:

enum class Thing { Zero, One, Two, Three, EndSentinel };

class Metadata {};

std::map<Thing, Metadata> extra_info;
typedef std::map<Thing, Metadata>::size_type map_type;

void foo() {
    // Can't forget these values
    extra_info[Thing::Zero] = Metadata();
    extra_info[Thing::One] = Metadata();
    extra_info[Thing::Two] = Metadata();
    extra_info[Thing::Three] = Metadata();
}

int main() {
    foo();

    assert(extra_info.size() == (map_type)Thing::EndSentinel);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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