c++ - tipos - typedef enum c ejemplo
El uso de enumeraciĆ³n sin un nombre de variable (5)
El segundo es una enum
sin nombre. Puedo ser útil cuando necesita los campos, pero no tiene la intención de declarar una variable de este tipo de enumeración.
Para proporcionar un ejemplo de "muy C ++" de su uso, a menudo lo verá en la metaprogramación de plantillas donde la enumeración se usa como un ''valor de retorno de tiempo de compilación'' sin la intención de declarar una variable de este tipo:
template<class T>
struct some_metafunction
{
enum { res = 0; };
};
Entiendo el primero pero el segundo? ¿Cuándo y por qué harías eso?
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
enum { HOMER, MARGE, BART, LISA, MAGGIE };
Esto simplemente crea expresiones constantes que tienen los valores respectivos, sin un tipo que no sea simplemente int
, por lo que no puede usar una enumeración sin nombre como un tipo para nada, tendrá que aceptar simplemente un int
y luego hacer una comparación con la constante.
Algo como esto:
void doSomething(int c);
Versus algo como esto:
void doSomething(cartoon c);
Por cierto, su implementación sería la misma, por lo que en el caso de enumeraciones sin nombre, el único inconveniente real es la tipificación fuerte.
Solo estoy proporcionando un ejemplo de uso en la vida real de una enumeración anónima, que encontré en un proyecto integrado. En el proyecto, se utiliza EEPROM para almacenar algunos parámetros. Supongamos que estos parámetros son las edades de los cartuchos, cada parámetro tiene el tamaño de 1 byte en la dirección continua.
Estos parámetros se copian en una matriz almacenada en la ROM cuando se enciende el procesador.
uint8_t ROM_AGE[END_AGE]
Si definimos una enumeración anomima aquí:
enum { HOMER_AGE, MARGE_AGE, BART_AGE, LISA_AGE, MAGGIE_AGE, END_AGE };
Luego, las palabras clave en enum se pueden usar para indexar la edad de cada carácter como ROM_AGE[HOMER_AGE]
. Al usar esta enumeración, la legibilidad es mucho mejor que usar ROM_AGE[0]
.
enum, union, struct y class tienen una parte común en la sintaxis que comparten este mismo patrón. Pero en algún momento puedes encontrar esto.
typedef enum { HOMER, MARGE, BART, LISA, MAGGIE } cartoont;
O si tiene una sola variable que contiene solo unos pocos estados.
enum { HOMER, MARGE, BART, LISA, MAGGIE } my_var;
Esto evita la siguiente declaración.
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
cartoon my_var;
puede definir dicha enumeración en una clase , lo que le da un alcance y ayuda a exponer las capacidades de la clase, por ejemplo,
class Encryption {
public:
enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 };
// ...
};
byte key[Encryption::DEFAUTL_KEYLEN];