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

and*_*ykx 3 c++ enums serialization templates

我已经写了枚举的序列化的函数模板/从我们的流类(是的,我知道的boost ::序列化,但它不是我的情况的一个选项).按照惯例,我们公司的枚举序列化为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;
}
Run Code Online (Sandbox Code Playgroud)

这些是简单的模板,它们也可以在我的函数模板中很好地工作,以便(de)序列化枚举项的向量.我担心它们过于通用,即它们也适用于T那些不能enums但可以转换为/来自的类型int.我可以改进枚举序列化模板(或者矢量序列化模板)以确保它们仅适用于enums的向量吗?

GMa*_*ckG 6

这里有两个改进:并不总是序列化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>>
Run Code Online (Sandbox Code Playgroud)

对于前者,在函数内部执行以下操作:

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>>
Run Code Online (Sandbox Code Playgroud)

这需要C++ 0x.

如果这不是一个选项,都enable_ifis_enum可以提高内被发现.但是,我认为你需要underlying_type自己做.(当然,在更糟糕的情况下is_enum,如果我没记错的话,你可以自己做三个,但这可能会很痛苦.)