std::underlying_type
Материал из cppreference.com
| Определён в заголовочном файле <type_traits>
|
||
| template< class T > struct underlying_type; |
(начиная с C++11) | |
Если T является полным типом перечисления, то предоставляет определение типа в члене type, которое будет равно внутрилежащему типу для T, иначе поведение будет не определено.
Содержание |
[править] Тип-член
| Имя | Определение |
type
|
Внутрилежащий тип для T
|
[править] Вспомогательный тип
| template< class T > using underlying_type_t = typename underlying_type<T>::type; |
(начиная с C++14) | |
[править] Примечание
Каждый тип перечисление имеет "внутрилежащий" тип, который может быть
1. Указан явно (как для глобальных, так и для типизированный перечислений)
2. Неявно, в этом случае он будет равен int для типизированных перечислений и зависимым от реализации целочисленным типом для глобальных перечислений.
[править] Отчёт о ошибках
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 2396 | C++11 | Неполные типы перечислений были разрешены | Полные типы перечислений необходимы |
[править] Пример
Запустить этот код
#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 << "Внутрилежащий тип для 'e1' является " << (e1_type?"unsigned":"non-unsigned") << '\n' << "Внутрилежащий тип для 'e2' является " << (e2_type?"int":"non-int") << '\n'; }
Вывод:
Внутрилежащий тип для 'e1' является unsigned Внутрилежащий тип для 'e2' является int

