我已经编写了一个函数模板,用于将枚举序列化到我们的流类中(是的,我知道boost :: serialization,但在我的情况下它不是一个选项)。按照惯例,我们公司的枚举序列化为int
:
template<typename T>
Stream& operator<<( Stream& s, T const& value )
{
s << ( int ) value;
}
template<typename T>
Stream& operator>>( Stream& s, T & value )
{
int v;
s >> v;
value = (T) v;
}
这些是简单的模板,它们也可以在我的函数模板中很好地工作(de)序列化枚举项的向量。我担心它们过于通用,即它们也适用于不是T
但可以转换为enums
的{{1}}类型int
。我可以改进枚举序列化模板(或者矢量序列化模板)以确保它们仅适用于enum
s的向量吗?
答案 0 :(得分:5)
这里有两个改进:并不总是序列化为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>>
对于前者,请在函数内执行以下操作:
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
。但是,我想你会need to make underlying_type
yourself。 (当然,在更糟糕的情况下,你可以自己做三个,但如果我没记错的话,is_enum
会很痛苦。)