Распаковка msgpack на произвольный объект, без msgpack_define

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

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

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

// 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 :: object из объекта «implicit_type».

Есть идеи?

2

Решение

Так что я понял это! Спасибо Гетепеперфану за идею

После очередной попытки использовать оператор >> перегрузка, проблема, которая помешала ему работать до странного способа, которым перегружается оператор >>, вызывается из кода msgpack.

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

Мне нужно было как использовать пространство имен msgpack, так и сопоставить подпись, возвращая строку по ссылке и взять объект в НЕ по ссылке. Это кажется немного нелепым, но это работает, и теперь я могу использовать встроенный «как<> «и конвертируем функциональность.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]