非常感谢你的时间我真的很感激它

有一个模板化子类,需要用谷物序列化库序列化,基本字数为空,它只存在,所以我们可以将shared_ptr的向量传染媒介到基类,允许它保存多种类型的模板子类,有效地允许传染媒体存储多种变量类型。

class NetVar_ {};
template <class VARTYPE> class NetVar : public NetVar_
{
public:
    NetVar(VARTYPE Value)
    {
        Var = Value;
    }

    template <class Archive> void serialize(Archive & archive)
    {
        archive(Var);
    }

private:
    VARTYPE Var;
};
.

BaseClass的以下向量推出了一些子类:

std::vector<std::shared_ptr<NetVar_>> PacketData;
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<std::string>>('test'));
.

最后,向量序列化并发送到远程机器以进行处理:

std::ostringstream SData;
{
    cereal::PortableBinaryOutputArchive Archive(SData);
    Archive(PacketData);
    //SData is sent to remote machine here through networking library.
}
.

我必须缺少拼图的关键块,因为当我反序列化程序抛出例外时,如果我调试输出变量的值是空白或大负数,导致我相信BaseClass和或子类未正确序列化。

代码已被简化为仅曝光此问题,有关您可以参考到这个问题。

附带以下谷物标头:

#include <cereal\archives\portable_binary.hpp>
#include <cereal\types\vector.hpp>
#include <cereal\types\memory.hpp>
#include <cereal\types\string.hpp>
.

我确定我需要更多,因为我开始将更多类型的数据添加到BaseClass中。

如果有人知道这里发生了什么,我会非常感激。

再次感谢您的时间。

有帮助吗?

解决方案

在这里没有选择,当您只访问基类接口时,多态需要虚拟性。它防止存档也是模板类型。

我想象谷物正在做一些sfinae来测试序列化方法的存在,如果找不到默认行为。这将是这里的情况,因为您没有编译错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top