Здесь необходимо сделать два улучшения: не всегда сериализовать как int
(не все перечисления), а как бы не был базовый тип.И, как ваш запрос, принимать только перечисления.
Последнее легко решается с помощью std::enable_if
и std::is_enum
:
typename std::enable_if<std::is_enum<T>::value, Stream&>::type
operator<<( Stream& s, T const& value )
// and likewise for operator>>
А для первого выполните следующие действия внутриfunction:
Stream& operator<<( Stream& s, T const& value )
{
typedef typename std::underlying_type<T>::type safe_type;
s << static_cast<safe_type>(value);
}
// and likewise for operator>>
Для этого требуется C ++ 0x.
Если это не вариант, в Boost можно найти как enable_if
, так и is_enum
.Тем не менее, я думаю, вам нужно будет сделать underlying_type
самостоятельно .(И, конечно, в худшем случае вы можете сделать все три самостоятельно, хотя, если я правильно помню, is_enum
может быть болезненным.)