如何知道类枚举的基础类型?

Kyl*_*yle 29 c++ c++11

我有一个变量声明为:

enum class FooEnum: uint64_t {}
Run Code Online (Sandbox Code Playgroud)

我想转换为它的基类型,但我不想硬编码基类型.例如,像这样:

FooEnum myEnum;
uint64_t * intPointer = (underlying_typeof(myEnum))&myEnum;
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Naw*_*waz 36

你可以用这个:

文档称,

定义了一个构件typedef的类型类型是用于枚举T.基础类型

所以你应该能够做到这一点:

#include <type_traits> //include this

FooEnum myEnum;
auto pointer = static_cast<std::underlying_type<FooEnum>::type*>(&myEnum);
Run Code Online (Sandbox Code Playgroud)


How*_*ant 17

你猜对了的语法非常接近.您正在寻找std::underlying_type<type_traits>:

#include <type_traits>
#include <cstdint>

enum class FooEnum: std::uint64_t {};

int main()
{
    FooEnum myEnum;
    uint64_t* intPointer = (std::underlying_type<FooEnum>::type*)&myEnum;
}
Run Code Online (Sandbox Code Playgroud)


Che*_*Alf 8

Visual C++ 10.0和MinGW g ++ 4.6.1都缺少std::underlying_type,但都接受此代码:

template< class TpEnum >
struct UnderlyingType
{
    typedef typename conditional<
        TpEnum( -1 ) < TpEnum( 0 ),
        typename make_signed< TpEnum >::type,
        typename make_unsigned< TpEnum >::type
        >::type T;
};
Run Code Online (Sandbox Code Playgroud)