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