将msgpack解压缩到任意对象,没有msgpack_define

时间:2013-07-31 14:33:43

标签: c++ msgpack

我正在处理一个代码体,它处理自定义的String实现而不是std :: string(长篇故事,但由于各种原因必须使用),我将从这里称之为“字符串”上。

我能够轻松地使用“原始”类型打包字符串,以包装原始字节和大小但是我在解压缩时遇到问题。

我能够手动解压缩它,如下所示。

// before this I've unpacked to the point where the following object has the string
msgpack::object_kv& kv = obj.via.map.ptr[0];
// kv.key == the String I want
String key = String(key.via.raw.ptr, key.via.raw.size); // this works

但我想使用内置的>>运算符或.as模板函数,但无法管理它。我无权修改String类来添加msgpack_unpack函数,也无法添加MSGPACK_DEFINE

我尝试创建一个结构并给它一个msgpack_unpack函数,但显然它用msgpack :: object :: implicit_type调用它,我的编译器回复

error: 'struct msgpack::object::implicit_type' is private

然后我无法弄清楚将msgpack ::对象从“implicit_type”对象中取出的任何方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

所以我明白了!感谢hetepeperfan的想法

在使用运算符>>进行另一次破解之后重载,阻止它在运算符奇怪的方式之前工作的问题>>从msgpack代码调用过载。

namespace msgpack {
    String& operator>>(msgpack::object o, String& v) {
        v = String(o.via.raw.ptr, o.via.raw.size);
        return v;
    }
}

我需要使用msgpack命名空间,并通过引用返回String来匹配签名,并通过引用获取 NOT 中的对象。这似乎有点荒谬,但它的工作原理我现在可以使用内置的“as<>”并转换功能。真棒!