gpt4 book ai didi

c++ - yaml-cpp、YAML::Node 和模板运算符 >>

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:30 25 4
gpt4 key购买 nike

我正在使用 yaml-cpp 进行某种序列化.为此,每个类都必须使用签名声明一个方法:

template <typename T> void Serialize(T& s);

那个T保存和加载时是不同的类。这两个类的接口(interface)是一样的,但是我不能做一个抽象基类,因为大多数方法都是模板。这部分工作正常。我试过将它与 YAML::Node 联系起来的 operator>>YAML::Emitteroperator<< .

对于 operator<< ,我有一个可行的解决方案,尽管非常残酷。首先为所有可序列化类声明一个父类(super class):

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) 都忽略它,并使用 operator>>在 nodeimp.h 中定义(yaml-cpp 的一部分):

template <typename T>
inline void operator >> (const Node& node, T& value) {
if(!ConvertScalar(node, value))
throw InvalidScalar(node.m_mark);
}

所以我的问题是:我应该如何解决这个问题?我绝对想要的是只有一个方法用于序列化和反序列化,并且能够使用 >> 和 <<,就像它是 yaml-cpp 支持的普通类型一样。

最佳答案

首先,关于reinterpret_cast :你真的想要static_cast .在你的情况下,你知道 val T (不只是一个 Serializable<T> ),所以你可以直接转换它。

在这里,我假设你要声明你的类

class Foo: public Serializable<Foo> { ... };

reinterpret_cast将解释 val字节作为T ,这不能保证有效,但可能适用于你的情况,因为你有单一继承和 Serializable<T>不添加任何成员变量。

接下来,关于您真正的问题:这是 yaml-cpp 中的一个错误,现在已修复(r52790a15757d 如果您跟上 mercurial 存储库,请参阅 http://code.google.com/p/yaml-cpp/issues/detail?id=126 了解我打开的问题) .

通过上述修复,我相信您的代码应该可以正常工作。如果您跟不上存储库,那么差异很小 - 您可以在您的 yaml-cpp 版本中对其进行修补。

关于c++ - yaml-cpp、YAML::Node 和模板运算符 >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7972874/

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