用 msgpack 打包多态类结构

Packing a polymorphous class structure with msgpack

本文关键字:多态 结构 msgpack 包多态      更新时间:2023-10-16

我想使用某种多态机制来打包我的C++类结构,msgpack只应用一次代码打包基类。

目前,我在基类和子类中打包数据两次。

这是我目前的状态:

class Base {
    public:
        template <typename Packer>
        void msgpack_pack(Packer& pk) const
        {
            pk.pack_map(1);
            pk.pack("key");
            pk.pack("value");
        }
};
class Subclass : public Base {
    public:
        template <typename Packer>
        void msgpack_pack(Packer& pk) const
        {
            pk.pack_map(2);
            // code repetition
            pk.pack("key");
            pk.pack("value");
            //////////////////
            pk.pack("child_key");
            pk.pack("child_value");
        }
};

我想摆脱"代码重复"之间的界限,但我现在知道如何实现这一点。如果有人有想法就好了。

您可以分解并调用基类。但它之前需要一些拆分:

class Base
{
protected:
    template <typename Packer>
    void msgpack_pack_content(Packer& pk) const
    {
        pk.pack("key");
        pk.pack("value");
    }
public:
    template <typename Packer>
    void msgpack_pack(Packer& pk) const
    {
        pk.pack_map(1);
        msgpack_pack_content(pk);
    }
};
class Subclass : public Base {
    template <typename Packer>
    void msgpack_pack_content(Packer& pk) const
    {
        Base::msgpack_pack_content(pk);
        //////////////////
        pk.pack("child_key");
        pk.pack("child_value");
    }
public:
    template <typename Packer>
    void msgpack_pack(Packer& pk) const
    {
        pk.pack_map(2);
        msgpack_pack_content(pk);
    }
};