首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将msgpack解压缩为任意对象,而不使用msgpack_define

将msgpack解压缩为任意对象,而不使用msgpack_define
EN

Stack Overflow用户
提问于 2013-07-31 14:33:43
回答 1查看 1.4K关注 0票数 3

我正在编写一套代码,它处理的是自定义字符串实现,而不是std::string (说来话长,但出于各种原因必须使用它),从现在起,我将将其称为" String“。

我能够轻松地打包字符串,而不用问题,使用" raw“类型来打包原始字符字节和大小,但是我在解压它时遇到了问题。

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

代码语言:javascript
复制
// 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模板函数,但一直无法管理它。我无权修改字符串类以添加msgpack_unpack函数,也无法添加MSGPACK_DEFINE

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

代码语言:javascript
复制
error: 'struct msgpack::object::implicit_type' is private

然后,我想不出从"implicit_type“对象中获取msgpack::object的任何方法。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2013-07-31 17:50:53

所以我想出来了!多亏了这一想法

在使用operator>>重载后,在operator>>被重载之前阻止它工作的问题是从msgpack代码中调用的。

代码语言:javascript
复制
namespace msgpack {
    String& operator>>(msgpack::object o, String& v) {
        v = String(o.via.raw.ptr, o.via.raw.size);
        return v;
    }
}

我需要同时使用msgpack命名空间,并通过通过引用返回字符串和接受对象而不是引用来匹配签名。这似乎有点可笑,但它有效,我现在可以使用内置的"as<>“和转换功能。太棒了!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17973310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档