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的向量吗?
这里有两个改进:并不总是序列化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>>
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_if和is_enum可以提高内被发现.但是,我认为你需要underlying_type自己做.(当然,在更糟糕的情况下is_enum,如果我没记错的话,你可以自己做三个,但这可能会很痛苦.)
| 归档时间: |
|
| 查看次数: |
1446 次 |
| 最近记录: |