使用 msgpack 打包多态 class 结构
Packing a polymorphous class structure with msgpack
我想用 msgpack
打包我的 C++ class 结构,使用一些 多态机制 只应用一次代码打包基础 classes .
目前,我正在将数据打包两次,分别在基础 class 和子class 中。
这是我目前的状态:
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");
}
};
我想摆脱 "code repetition" 之间的线条,但我现在知道如何实现这一点。如果有人有想法就太好了。
您可以分解并调用基数 class。
但之前需要一些拆分:
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);
}
};
我想用 msgpack
打包我的 C++ class 结构,使用一些 多态机制 只应用一次代码打包基础 classes .
目前,我正在将数据打包两次,分别在基础 class 和子class 中。
这是我目前的状态:
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");
}
};
我想摆脱 "code repetition" 之间的线条,但我现在知道如何实现这一点。如果有人有想法就太好了。
您可以分解并调用基数 class。 但之前需要一些拆分:
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);
}
};