2015-08-19 16 views
6

klasik C++ enums değer verir.C++ 11 Enum sınıfı yinelenen değerleri tespit etmek için bir yalındır yöntem yok

bu konunun yeni C++ 11 enum class ele mi?

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

Bu bir sorun değil, kasıtlı ve yararlıdır. –

+2

@JonathanWakely Burada bir sorun var: Bazen, kopyaları önlemek/tespit etmek için bir yol istemelisiniz. Diğer zamanlarda yapmazsın. Onu kolayca algılamanın bir yolu olmaması bir sorundur; Çoğalmayı engelleyen eksiklik bir sorun değildir ve soruda sorulmamıştır. Bu konu, yansıma çalışma grubu çalışmalarını standart haline getirdiği zaman çözülmelidir. – Yakk

cevap

4

Şu anda bir enumda birden çok aynı enum değerini algılamaya veya engellemeye yönelik bir yöntem yoktur. yetenek C C++ kodu iç gözlem ++ kod - - dile

The reflection working group

yansıma nasıl ekleneceği üzerinde çalışıyor. Yansıtmanın kapladığı uzun bir listede, üzerinde çalışılan kısa bir liste vardır ve bu kısa listede, derleme zamanında bir sayımın değerlerini inceler.

N4428 enum yansıması için bir öneri içeriyor. Orada There are some partial implementations. N4428 altında

çiftleri tespit kolay olacaktır. Derleme zamanında, numaralandırma sayısını ve değerlerini alabilirsiniz. Sırayla tüm enum değerlerinin bir paketini oluşturun ve benzersiz olduklarını test edin. Sonra bu testin sonucunu static_assert'a atın.

Nihai sonuç olabilir:

template<class E> 
constexpr bool all_values_unique(); // todo 

static_assert(all_values_unique<ConnectionState>(), "Duplicate enum value detected"); 

öncesinde C++ eklenen bu yansıma önerisi gibi bir şeye, bu mümkün değildir.

Makrolar kullanarak bunu gerçekleştirebilirsiniz - her iki noktanızı oluşturan ve yansıma özellikleri hakkında bilgi veren bir makro bulundurun - sonra yansıma özellikleri bilgilerini kullanan all_values_unique yazın. Bu, standart ve/veya derleyiciniz gereken yansıma özelliklerine sahip olunduğu zaman, makrolarınızı çıkarmanın kolay olması avantajına sahiptir.

İlgili konular