2

我正在编写处理自定义 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 的方法。

有任何想法吗?

4

1 回答 1

2

所以我想通了!感谢 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 命名空间,并通过引用返回字符串来匹配签名,并通过引用获取对象。这看起来有点荒谬,但它有效,我现在可以使用内置的“as<>”并转换功能。惊人的!

于 2013-07-31T17:50:53.937 回答