2013-07-31 1 views
2

Я работаю над телом кода, который имеет дело с пользовательской реализацией String, а не с std :: string (длинная история, но по разным причинам это должно быть использовано), которое я будет упоминаться как «String» здесь.Распаковка msgpack на произвольный объект без msgpack_define

Я смог легко упаковать строку без проблем, используя «сырой» тип, чтобы упаковать необработанные байты и размер, но у меня проблемы с его распаковкой.

Я смог вручную распаковать его, как показано ниже.

// 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

Возможно, это может выполнить задание 'String & operator >> (String, yourtype)' реализовано как функция вместо члена класса – hetepeperfan

+0

После того, как я еще раз посмотрел, я наконец понял, почему мои попытки оператора >> раньше не работали , Я отвечу на вопрос с полным результатом. – Zeroshade

ответ

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, и совпадает с подписью, возвращая строку по ссылке и принять объект в НЕ по ссылке. Это кажется немного смешным, но он работает, и теперь я могу использовать встроенный «как <>» и преобразовать функциональность. здорово!