經典的C++枚舉不具有直接檢測重複值的方法。C++ 11包含重複值的Enum類
這個問題是在新的C++ 11 enum class
中解決的嗎?
enum class ConnectionState : uint32_t
{
Connecting,
Reconnecting = 2,
Disconnecting,
LocalConnection,
NoNetwork = 2,
WifiNetwork,
Last
}
經典的C++枚舉不具有直接檢測重複值的方法。C++ 11包含重複值的Enum類
這個問題是在新的C++ 11 enum class
中解決的嗎?
enum class ConnectionState : uint32_t
{
Connecting,
Reconnecting = 2,
Disconnecting,
LocalConnection,
NoNetwork = 2,
WifiNetwork,
Last
}
目前沒有辦法檢測或防止枚舉中的多個相同的枚舉值。
The reflection working group正在研究如何向C++代碼添加反射 - C++代碼的能力 - 語言。在反思所涵蓋的長長的內容列表中,有一個簡短的列表正在處理,在這個簡短的列表中,在編譯時檢查枚舉的值就在那裏。
N4428包含枚舉反射的提議。 There are some partial implementations在那裏。
在N4428下,檢測重複項很容易。您可以在編譯時獲取枚舉值的數量及其值。只需按順序創建一個包含所有枚舉值的包,並測試它們是唯一的。然後將該測試的結果折成static_assert
。
最終結果可能是:
template<class E>
constexpr bool all_values_unique(); // todo
static_assert(all_values_unique<ConnectionState>(), "Duplicate enum value detected");
之前像被添加到C++的反射建議,這是不可能的。
你可以使用宏來僞裝它 - 有一個既能創建枚舉又能創建反射特徵信息的宏 - 然後編寫使用反射特徵信息的all_values_unique
。這樣做的好處是,如果/當標準和/或編譯器獲得所需的反射功能時,可能很容易去掉你的宏。
這不是一個問題,它是故意的和有用的。 –
@JonathanWakely這裏有一個問題:有時,你確實想要一種方法來防止/檢測重複。其他時候你不會。缺乏容易檢測的方法是一個問題;缺乏防止重複的問題不是問題,也不是在問題中要求的。如果反射工作組將其工作轉換爲標準,則應解決此問題。 – Yakk