【问题标题】:yaml-cpp, YAML::Node, and a template operator >>yaml-cpp、YAML::Node 和模板运算符 >>
【发布时间】:2011-11-01 21:02:46
【问题描述】:

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

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

T 在保存和加载时是一个不同的类。这两个类的接口是一样的,但是我不能做一个抽象基类,因为大多数方法都是模板。这部分工作正常。我尝试将它与YAML::Nodeoperator&gt;&gt;YAML::Emitteroperator&lt;&lt; 连接起来。

对于operator&lt;&lt;,我有一个可行的解决方案,尽管它非常残酷。首先为所有可序列化的类声明一个超类:

template <typename T> class Serializable {};

那我可以使用下面的operator&lt;&lt;

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&gt;&gt; 进行了同样的尝试,但没有成功。它看起来像这样:

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&gt;&gt;

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

所以我的问题是:我应该如何解决这个问题?我绝对想要的是只有一个用于序列化和反序列化的方法,并且能够使用 >> 和

【问题讨论】:

    标签: c++ templates yaml-cpp


    【解决方案1】:

    首先,关于reinterpret_cast:你实际上想要static_cast。在您的情况下,您知道val T(不仅仅是Serializable&lt;T&gt;),因此您可以直接转换它。

    在这里,我假设您正在声明您的类

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

    reinterpret_cast 会将valbytes 解释为T,这不能保证有效,但可能适用于您的情况,因为您有单继承和Serializable&lt;T&gt;不添加任何成员变量。

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

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

    【讨论】:

    • 奇怪,我试过static_cast,但没用,但现在可以了。 (也许我试图转换为 T,而不是 T*?)。无论如何,您的补丁效果很好,感谢您的修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多