Les Enums en C++

Qu'est-ce qu'un Enum ?

En C++, un énumérateur (ou enum) est un type défini par l'utilisateur permettant de regrouper un ensemble de valeurs spécifiques pour une variable. Cela signifie que la variable ne peut prendre qu'une valeur parmi un ensemble restreint de valeurs possibles.

Syntaxe des Enums

Pour définir un énumérateur, on utilise le mot-clé enum suivi du nom de l'énumérateur et de la liste des valeurs possibles entre accolades. Voici un exemple simple :

enum Day {sun, mon, tue, wed, thu, fri, sat};

Dans cet énumérateur, les valeurs associées à chaque jour sont les suivantes : - sun aurait la valeur de 0 - mon aurait la valeur de 1 - tue aurait la valeur de 2 - wed aurait la valeur de 3 - thu aurait la valeur de 4 - fri aurait la valeur de 5 - sat aurait la valeur de 6

Dans un autre exemple, nous pouvons définir un énumérateur avec des valeurs attribuées explicitement :

enum Grade {freshman=9, sophomore, junior, senior};

Ici, l'énumérateur freshman reçoit directement la valeur 9, et les autres énumérateurs reçoivent automatiquement des valeurs croissantes.

Enums Scoped

Les enums scoped, introduits dans C++11, présentent des différences par rapport aux enums non scoped : - Les constantes sont encapsulées dans leur propre espace de noms. - Ils sont fortement typés, ce qui empêche les conflits de noms avec d'autres énumérateurs.

Voici un exemple de leur utilisation :

enum class WeekDay {sun, mon, tue, wed, thu, fri, sat};
WeekDay day = WeekDay::sun; // 'sun' est précédé de 'WeekDay::'
int friday = static_cast(WeekDay::fri); // Doit caster pour obtenir un int

Dans cet exemple, l'énumération évite tout conflit :

enum class LogResult {Success, InvalidFileName, WriteError};
enum class SocketResult {Success, InvalidAddrError, TimeoutError};
LogResult logger_result = LogResult::Success;
if (logger_result == LogResult::Success) {}

Ici, Success appartient à l'espace de noms LogResult, évitant ainsi un conflit avec SocketResult::Success.