C++ yaml cpp、yaml::Node和模板操作符>&燃气轮机;
我正在用它进行某种序列化。要使其工作,每个类必须使用签名声明一个方法:C++ yaml cpp、yaml::Node和模板操作符>&燃气轮机;,c++,templates,yaml-cpp,C++,Templates,Yaml Cpp,我正在用它进行某种序列化。要使其工作,每个类必须使用签名声明一个方法: template <typename T> void Serialize(T& s); 然后,我可以使用nodeimp.h(yaml cpp的一部分)中定义的以下运算符: 模板 内联无效运算符>>(常量节点和节点,T和值){ 如果(!ConvertScalar(节点,值)) 投掷无效刻度(node.m_标记); } 所以我的问题是:我应该如何解决这个问题?我绝对想要的是,对于序列化和反序列化,只有一个
template <typename T> void Serialize(T& s);
然后,我可以使用nodeimp.h(yaml cpp的一部分)中定义的以下运算符:
模板
内联无效运算符>>(常量节点和节点,T和值){
如果(!ConvertScalar(节点,值))
投掷无效刻度(node.m_标记);
}
所以我的问题是:我应该如何解决这个问题?我绝对想要的是,对于序列化和反序列化,只有一个方法,并且能够使用>>和首先,关于重新解释cast
:您实际上想要静态cast
。在您的例子中,您知道val
是T
(而不仅仅是可序列化的
),因此您可以直接对其进行强制转换
在这里,我假设您将类声明为
class Foo: public Serializable<Foo> { ... };
class Foo:public Serializable{…};
reinterpret\u cast
会将val
的字节解释为T
,这不保证有效,但可能在您的情况下有效,因为您有单一继承,并且Serializable
不会添加任何成员变量
接下来,谈谈您真正的问题:这是yaml cpp中的一个bug,现在已经修复了(如果您正在关注mercurial存储库,请参阅我打开的问题)
通过上述修复,我相信您的代码应该可以工作。如果您没有跟上存储库的进度,那么差异非常小-您可以在您的yaml cpp版本中对其进行修补。奇怪的是,我尝试了static\u cast
,但它不起作用,但现在起作用了。(也许我试着投T,而不是T*?)。无论如何,你的补丁工作得很好,谢谢你的修复。
template <typename T>
YAML::Emitter& operator<<(YAML::Emitter& out,
Serializable<T>& val)
{
Serializer serializer(out);
reinterpret_cast<T*>(&val)->Serialize(serializer);
return out;
}
template <typename T>
void operator>>(const YAML::Node& node,
Serializable<T>& val)
{
Deserializer deserializer(node);
reinterpret_cast<T*>(&val)->Serialize(deserializer);
}
template <typename T>
inline void operator >> (const Node& node, T& value) {
if(!ConvertScalar(node, value))
throw InvalidScalar(node.m_mark);
}
class Foo: public Serializable<Foo> { ... };