Ir para o conteúdo

Última atualização:2026-10-12

C++ enum class enumerações fortemente tipadas

No Effective Modern C++, Item 10: Prefer scoped enums to unscoped enum recomenda-se usar enum class com escopo no lugar do enum sem escopo.

Por exemplo:

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

O erro acima ocorre porque os dois circle estão no mesmo escopo. Para o enum, isso equivale a:

#define circle 0
#define retangle 1
Portanto, definir circle de novo depois gera erro.

Assim, não importa se os nomes dos enums são iguais: basta que haja membros coincidentes para haver problema. Por exemplo:

enum A {a,b};
enum B {c,a};
a aparece duas vezes; o erro é apontado no a do enum B.

Pelo que vimos antes, o nome do enum não desempenha nenhum papel quanto ao escopo; por isso, lembramos do namespace, como no exemplo abaixo:

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

void foo(EntityType::Enum entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}
Dando nomes interessantes aos namespaces, dá para obter o efeito desejado.

Mas usar namespaces sem parar torna-se por demais trabalhoso; além disso, se eu não quiser usar namespace, alcançar esse efeito torna-se inseguro e sem restrições.

Por isso, a partir do C++11, foi introduzido o enum class.

O enum class resolve problemas como definir o tipo dos membros do enum, a segurança de tipos e as restrições. Voltando ao exemplo acima:

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

void foo(EntityType entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}
Este é o idiom que esta seção quer expor: enum class.

Tópicos relacionados

Comentários