Для вывода оператор <<
переведет любой тип перечисления в ближайшее соответствие int
или long
. (§5.8 / 1, 4.5 / 2) У вас не должно быть никаких проблем, и я не смог бы создать ни одного с GCC или Comeau. Поправь меня, если я ошибаюсь.
Для ввода вы можете написать шаблонную функцию и отключить неявное создание экземпляров, скрыв ее внутри только явно созданного класса.
template< class E >
struct enum_traits {
friend std::istream &operator>> ( std::istream &is, E &e ) {
long i; // or intmax_t, whatever
std::istream &r = is >> i;
e = E( i );
return r;
}
};
enum my_enum { a, b, c };
template class enum_traits< my_enum >; // explicit instantiation
// "matching declaration" per 7.3.1.2/3:
std::istream &operator>> ( std::istream &, my_enum & );
Это проходит GCC и Comeau. Я не могу найти способ обернуть пространства имен и ADL, чтобы сделать его более удобным. (Единственное альтернативное решение предполагает использование объявления для каждого перечислителя.)
Но два шаблонных объявления можно заключить в макрос, или в любом случае они лучше, чем переписать всю функцию заново!