Aquí es otro enfoque para cuando underlying_type no está presente. Este método no intenta detectar la firma de la enumeración, solo le da un tipo del mismo tamaño, que es más que suficiente para muchas situaciones.
template<int>
class TIntegerForSize
{
typedef void type;
};
template<>
struct TIntegerForSize<1>
{
typedef uint8_t type;
};
template<>
struct TIntegerForSize<2>
{
typedef uint16_t type;
};
template<>
struct TIntegerForSize<4>
{
typedef uint32_t type;
};
template<>
struct TIntegerForSize<8>
{
typedef uint64_t type;
};
template<typename T>
struct TIntegerForEnum
{
typedef typename TIntegerForSize<sizeof(T)>::type type;
};
Uso:
enum EFoo {Alpha, Beta};
EFoo f = Alpha;
TIntegerForEnum<EFoo>::type i = f;
TIntegerForEnum<decltype(f)>::type j = f;
http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast fundición, específicamente dinámico – L7ColWinters
@ L7ColWinters ' dynamic_cast' no puede ayudar. No permita que la palabra clave 'class' y': uint64_t' lo induzca a error al pensar que las enumeraciones de ámbito y los tipos subyacentes de enumeraciones son similares a la herencia de clases. –