Forse a causa del mio background in altre lingue dove la tipizzazione di enum
è più rigorosa (*), tendo a pensare che se vuoi un tipo in grado di contenere un insieme di costanti, usa un enum
, se vuoi un gruppo di costanti, usa un gruppo di costanti e non introdurre un tipo dove non ce n'è bisogno.
Ci sono state considerazioni che hanno reso la scelta di una enum
migliore al momento, ma l'unica che posso pensare che sia sopravvissuta alla normalizzazione di C ++ 98 è la compatibilità con C e le precedenti implementazioni di C ++ (e alcuni hanno mantenuto come il loro stile ciò che era necessario quando lo hanno stabilito).
Ciò che è sopravvissuto sono le considerazioni che hanno reso preoccupante l'uso di un tipo aggiuntivo. Il fatto che le costanti siano di un altro tipo che normalmente non viene utilizzato può interferire con la risoluzione di sovraccarico e la deduzione di tipo nei modelli. Le regole sono tali che di solito ciò che vuoi - forse a costo di un'istanza aggiuntiva per il tipo spuri di enum
- ma ci sono momenti in cui non lo è. Ad esempio
template <typename T> MyClass<T> make_MyClass(T) {...}
restituisci un MyClass<Size>
per make_MyClass(PAGE_SIZE)
dove probabilmente ti aspetteresti un MyClass<int>
se la ragione per introdurre l'enum non era avere un tipo ma introdurre delle costanti.
(*) nota che una tipizzazione più rigorosa di enum
è stata ritenuta sufficientemente desiderabile che una variazione è ora fornita come enum class
da C ++ 11.