std::underlying_type
Definido en el archivo de encabezado <type_traits>
|
||
template< class T > struct underlying_type; |
(desde C++11) | |
Si T
es un tipo enumeración completo, proporciona una definición de tipo (typedef) miembro type
que denomina el tipo subyaceente de T
.
De lo contrario, el comportamiento está indefinido. |
(hasta C++20) |
De lo contrario, si |
(desde C++20) |
El comportamiento de un programa que añade especializaciones para underlying_type
no está definido.
Contenido |
[editar] Tipos miembro
Nombre | Definición |
type
|
El tipo subyacente de T .
|
[editar] Tipos auxiliares
template< class T > using underlying_type_t = typename underlying_type<T>::type; |
(desde C++14) | |
[editar] Notas
Cada tipo enumeración tiene un tipo subyacente, que puede ser
1. Especificado explícitamente (tanto enumeraciones con ámbito como sin ámbito).
2. Omitido, en cuyo caso es int para enumeraciones con ámbito o un tipo entero definido por la implementación capaz de representar todos los valores de la enumeración (para enumeraciones sin ámbito).
[editar] Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
LWG 2396 | C++11 | Se permitían los tipos enumeración incompletos | Se requieren tipos enumeración completos |
[editar] Ejemplo
#include <iostream> #include <type_traits> enum e1 {}; enum class e2: int {}; int main() { bool e1_type = std::is_same< unsigned ,typename std::underlying_type<e1>::type >::value; bool e2_type = std::is_same< int ,typename std::underlying_type<e2>::type >::value; std::cout << "el tipo subyacente de 'e1' es " << (e1_type?"unsigned":"no-unsigned") << '\n' << "el tipo subyacente de 'e2' es " << (e2_type?"int":"no-int") << '\n'; }
Salida:
el tipo subyacente de 'e1' es unsigned el tipo subyacente de 'e2' es int