Oto inne podejście do kiedy basis_type nie jest obecny. Ta metoda nie próbuje wykryć podpisu enum, wystarczy podać typ tego samego rozmiaru, który jest więcej niż wystarczający dla wielu sytuacji.
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;
};
Zastosowanie:
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 casting, specjalnie dynamiczny – L7ColWinters
@ L7ColWinters ' dynamic_cast' nie może pomóc. Nie pozwól, aby słowo kluczowe "class" i ': uint64_t' wprowadzały użytkownika w błąd, że zakresy wyliczeń i typy wyrażeń są podobne do dziedziczenia klas. –