【问题标题】:Unpacking msgpack to an arbitrary object, without msgpack_define将 msgpack 解包到任意对象,无需 msgpack_define
【发布时间】:2013-07-31 14:33:43
【问题描述】:

我正在编写处理自定义 String 实现而不是 std::string 的代码体(说来话长,但由于各种原因必须使用它),我将在此处将其称为“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

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

有什么想法吗?

【问题讨论】:

  • 也许这可以完成 String& operator>>( String, yourtype) 的工作,实现为函数而不是类成员
  • 再看一遍后,我终于明白了为什么我之前对 operator>> 的尝试没有奏效,我会用完整的结果来回答这个问题。

标签: c++ msgpack


【解决方案1】:

所以我想通了!感谢 hetepeperfan 的想法

在再次尝试使用 operator>> 重载之后,在从 msgpack 代码调用 operator>> 被重载的奇怪方式之前阻止它工作的问题。

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

我需要同时使用 msgpack 命名空间,并通过引用返回字符串来匹配签名,并通过引用获取 NOT 中的对象。这看起来有点荒谬,但它有效,我现在可以使用内置的“as”并转换功能。太棒了!

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多