2015-08-19 132 views
6

經典的C++枚舉不具有直接檢測重複值的方法。C++ 11包含重複值的Enum類

這個問題是在新的C++ 11 enum class中解決的嗎?

enum class ConnectionState : uint32_t 
{ 
    Connecting, 
    Reconnecting = 2, 
    Disconnecting, 
    LocalConnection, 
    NoNetwork = 2, 
    WifiNetwork, 
    Last 
} 
+2

這不是一個問題,它是故意的和有用的。 –

+2

@JonathanWakely這裏有一個問題:有時,你確實想要一種方法來防止/檢測重複。其他時候你不會。缺乏容易檢測的方法是一個問題;缺乏防止重複的問題不是問題,也不是在問題中要求的。如果反射工作組將其工作轉換爲標準,則應解決此問題。 – Yakk

回答

4

目前沒有辦法檢測或防止枚舉中的多個相同的枚舉值。

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。這樣做的好處是,如果/當標準和/或編譯器獲得所需的反射功能時,可能很容易去掉你的宏。