【发布时间】:2011-11-01 21:02:46
【问题描述】:
我正在使用yaml-cpp 进行某种序列化。为此,每个类都必须使用签名声明一个方法:
template <typename T> void Serialize(T& s);
T 在保存和加载时是一个不同的类。这两个类的接口是一样的,但是我不能做一个抽象基类,因为大多数方法都是模板。这部分工作正常。我尝试将它与YAML::Node 的operator>> 和YAML::Emitter 的operator<< 连接起来。
对于operator<<,我有一个可行的解决方案,尽管它非常残酷。首先为所有可序列化的类声明一个超类:
template <typename T> class Serializable {};
那我可以使用下面的operator<<:
template <typename T>
YAML::Emitter& operator<<(YAML::Emitter& out,
Serializable<T>& val)
{
Serializer serializer(out);
reinterpret_cast<T*>(&val)->Serialize(serializer);
return out;
}
到目前为止,这有效,尽管 reinterpret_cast 看起来很可怕,而且我不确定它是否合法。我对operator>> 进行了同样的尝试,但没有成功。它看起来像这样:
template <typename T>
void operator>>(const YAML::Node& node,
Serializable<T>& val)
{
Deserializer deserializer(node);
reinterpret_cast<T*>(&val)->Serialize(deserializer);
}
但 gcc (4.6.2) 和 clang(2.9) 都忽略它,并使用 nodeimp.h(yaml-cpp 的一部分)中定义的operator>>:
template <typename T>
inline void operator >> (const Node& node, T& value) {
if(!ConvertScalar(node, value))
throw InvalidScalar(node.m_mark);
}
所以我的问题是:我应该如何解决这个问题?我绝对想要的是只有一个用于序列化和反序列化的方法,并且能够使用 >> 和
【问题讨论】: