Daily bit(e) of C++. std::to_underlying

Добавлено 18 июля 2026 в 16:54

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

Daily bit(e) C++

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

Пример на Compiler Explorer

Теги

C++ / CppC++23Daily bit(e) C++Программирование