首页 > 解决方案 > 将作用域枚举转换为基础类型

问题描述

给定一个范围枚举,是否可以在不显式指定基础类型的情况下转换为基础类型?

例子:

enum class HeapCorruptionDetectMethod {//default is int
    write_on_freed,
    buffer_underrun,
    buffer_overrun
};

auto active_method = HeapCorruptionDetectMethod::write_on_freed;

//...

//agnostic about the underlying type:
auto index = static_cast<*underlying_type*>(active_method);

换句话说,是否可以查询底层类型?

标签: c++enumsc++17

解决方案


您可以尝试以下模板功能,我觉得它非常方便且富有表现力:

template <typename Enum>
constexpr typename std::enable_if<std::is_enum<Enum>::value, typename std::underlying_type<Enum>::type>::type
get_underlying(Enum const& value) {
    return static_cast<typename std::underlying_type<Enum>::type>(value);
}

然后你可以像这样使用它:

enum class Foo : int {
    A = 0,
    B = 1
};

int main() {
    std::cout << get_underlying(Foo::A) << std::endl; // 0
    std::cout << get_underlying(Foo::B) << std::endl; // 1

    return 0;
}

现场查看


推荐阅读