Saltar a contenido

Última actualización:2026-10-12

C++ enum class enumeraciones fuertemente tipadas

En Effective Modern C++, Item 10: Prefer scoped enums to unscoped enum recomienda usar enum class con ámbito en lugar de enum sin ámbito.

Por ejemplo:

enum Shape {circle,retangle};
auto circle = 10;  // error

El error anterior se debe a que los dos circle están en el mismo ámbito. Para enum equivale a:

#define circle 0
#define retangle 1
Por eso, definir circle más adelante da un error.

Así que, aunque los nombres de las enumeraciones sean distintos, basta con que uno de sus miembros coincida para que haya problemas. Por ejemplo:

enum A {a,b};
enum B {c,a};
a aparece dos veces, y el error se produce en el a de enum B.

Por lo que vimos antes, el nombre del enum no aporta nada en cuanto al ámbito, así que se nos ocurre usar namespace, como en el ejemplo siguiente:

// 在创建枚举时,将它们放在名称空间中,以便可以使用有意义的名称访问它们:
namespace EntityType {
    enum Enum {
        Ground = 0,
        Human,
        Aerial,
        Total
    };
}

void foo(EntityType::Enum entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}
Poniendo nombres significativos a los espacios de nombres se consigue el efecto deseado.

Pero usar espacios de nombres continuamente resulta demasiado engorroso y, si no quiero usar namespace y aún así quiero conseguir ese efecto, la cosa se vuelve insegura y sin restricciones.

Por eso, a partir de C++11 se introdujo enum class.

enum class resuelve problemas como la definición del tipo de los miembros del enum, la seguridad de tipos y las restricciones. Volviendo al ejemplo anterior:

// enum class
enum class EntityType {
    Ground = 0,
    Human,
    Aerial,
    Total
};

void foo(EntityType entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}
Este es el idioma que quiere explicar esta sección: enum class.

Temas relacionados

Comentarios