我正在处理一个代码体,它处理自定义的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”对象中取出的任何方法。
有什么想法吗?
答案 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<>”并转换功能。真棒!