Я решил создать новый ответ, потому что мой старый был таким грязным. В любом случае, я просто хочу кое-что сказать о C ++ 11, где вы можете получить базовый тип перечисления, используя этот:
std::underlying_type_t<E>
И ради интереса, идея разрешения перегрузки. Но, пожалуйста, используйте имена для хранения перечисления, как предложено @lothar.
Разрешение перегрузки связано с тем, что существует одно повышение от перечисления до первого типа int, unsigned int, long, unsigned long, которое может представлять все значения его базового типа. Преобразование в любой другой целочисленный тип имеет более низкий рейтинг, и разрешение перегрузки не предпочтет его.
char (& f(int) )[1];
char (& f(unsigned int) )[2];
char (& f(long) )[3];
char (& f(unsigned long) )[4];
char const* names[] = {
"int", "unsigned int",
"long", "unsigned long"
};
enum a { A = INT_MIN };
enum b { B = UINT_MAX };
enum c { C = LONG_MIN };
enum d { D = ULONG_MAX };
template<typename T> void print_underlying() {
std::cout << names[sizeof(f(T()))-1] << std::endl;
}
int main() {
print_underlying<a>();
print_underlying<b>();
print_underlying<c>();
print_underlying<d>();
}
И это печатает здесь:
int
unsigned int
int
unsigned int
Это не представляет особого интереса для этой проблемы сериализации (поскольку размер сериализованных данных не имеет постоянной ширины, и это может вызвать проблемы при изменении перечисления и его базового типа), но обычно интересно выяснить тип, хранящий все перечисление. Ура!