gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:30:50 27 4
gpt4 key购买 nike

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

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

最佳答案

这里有两个改进:不总是序列化为 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。

如果这不是一个选项,enable_ifis_enum 都可以在 Boost 中找到。但是,我想你会need to make underlying_type yourself . (当然,在最坏的情况下,您可以自己完成所有这三个操作,但如果我没记错的话,is_enum 可能会很痛苦。)

关于c++ - 用于枚举序列化的函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5711662/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com