Daily bit(e) of C++. std::to_underlying
Добавлено 18 июля 2026 в 16:54
Daily bit(e) C++ 32, узкоспециализированное приведение типов для преобразования значений перечислений в значение базового типа: std::to_underlying.

std::to_underlying – это узкоспециализированное приведение типов в C++23, которое преобразует значение перечисления в базовый целочисленный тип перечисления.
Этот одношаговый подход заменяет предыдущий подход с использованием static_cast в сочетании с утилитой std::underlying_type из C++11. Утилита std::underlying_type была необходима, поскольку базовый тип не ограниченных областью видимости перечислений определяется реализацией.
#include <utility>
#include <type_traits>
#include <cstdint>
enum Color {
RED,
GREEN,
BLUE
};
enum Info {
LIMIT = UINT64_MAX
};
enum class MyColor {
RED,
GREEN,
BLUE
};
auto a = std::to_underlying(RED);
// a == 0, sizeof(a) == sizeof(int) (конкретный тип определяется реализацией)
auto b = std::to_underlying(LIMIT);
// b == UINT64_MAX, decltype(b) беззнаковый тип с размером uint64_t
// До C++23 нам приходилось полагаться на static_cast
auto c = static_cast<std::underlying_type<Info>::type>(LIMIT); // C++11
auto d = static_cast<std::underlying_type_t<Info>>(LIMIT); // C++14
// b == c == d
// Перечисления с ограниченной областью видимости имеют четко определенный базовый тип.
auto e = std::to_underlying(MyColor::GREEN);
// e == 1, decltype(e) == int
