我沒有看到比OP提供的解決方案更好的解決方案。但是,它有一個小缺陷,我可以提出一個(非標準)解決方法。
問題如下。假設今天的代碼是在OP但是,有一天,有人增加了一個新的枚舉EnumClass
成爲:
enum class EnumClass { A, B = 4, C = 9, D = 60, E = 70 };
還假設這個人忘記更新的checkEnumClass
的定義(這不是不可能發生,特別是如果代碼在另一個文件中)。然後,
checkEnumClass(70);
會盡管70現在是一個有效的返回值false
。單元測試可能有助於捕捉這個錯誤,但是人員必須記得更新測試。 (回想一下,他們忘放在第一位更新代碼!)
不幸的是,標準C++不提供一種方法來強制switch
上enum
覆蓋所有的情況下(與d它提供了final switch
statement) 。
但是,有編譯器特有的功能可以爲您做到這一點。您可以添加編譯器選項-Wswitch
(或-Wall
,這意味着-Wswitch
)。對於GCC(以及我相信,鐺,以及)也可以添加編譯器選項-Wswitch
。對於Visual Studio,您可以添加
#pragma warning(error : 4062)
含checkEnumClass
(不包含枚舉定義文件)
最後的文件,你必須稍微改變checkEnumClass
因爲default
標籤告訴編譯器,所有病例被覆蓋的。該代碼應該是這樣的:
bool checkEnumClass(int v)
{
switch(static_cast<EnumClass>(v))
{
case EnumClass::A:
case EnumClass::B:
case EnumClass::C:
case EnumClass::D:
return true;
}
return false;
}
有了這個解決辦法,誰包括枚舉E
但忘了更新checkEnumClass
因此將得到下面的錯誤/警告的人:
GCC:
警告:枚舉值'E'未在開關中處理[-Wswitch]
Visual Stud IO:
錯誤C4062:枚舉 'EnumClass' 的開關枚舉 'E' 不被處理
開關(的static_cast < EnumClass>(V))
更新1:繼由elvis.dukaj發表評論。
作爲一個良好的做法,將-Werror
添加到海灣合作委員會的選項將所有警告轉化爲錯誤。
更新2:比-Wswitch
更好的爲-Wswitch-enum
這將提高(如果-Werror
或錯誤)的警告,即使有一個default
標籤。不幸的是,我不知道Visual Studio中的任何類似功能。
爲什麼不使用checkEnumClass(EnumClass)? – camino
因爲我必須解析一些整數...並檢查(或更好地保證)整數可轉換爲枚舉 –
enum可以在其最小值和最大值之間保存任何值:http://stackoverflow.com/a/ 7676940/951890 –