用于序列化枚举的函数模板

时间:2011-04-19 04:38:31

标签: c++ templates serialization enums

我已经编写了一个函数模板,用于将枚举序列化到我们的流类中(是的,我知道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的向量吗?

1 个答案:

答案 0 :(得分:5)

这里有两个改进:并不总是序列化为int(并非所有枚举都是),而是基本类型。并且,根据您的要求,只接受枚举。

后者很容易通过std::enable_ifstd::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_ifis_enum。但是,我想你会need to make underlying_type yourself。 (当然,在更糟糕的情况下,你可以自己做三个,但如果我没记错的话,is_enum会很痛苦。)