2016-07-14 4 views
0

Я бы хотел отправить следующую структуру через msgpack.msgpage C++: отправить raw указатель с MSGPACK_DEFINE

struct MyStruct { 
    std::string  name{""}; 
    int*   val{nullptr}; 

    MSGPACK_DEFINE(name, val); 
}; 

До сих пор во всех моих проектах, единственным способом я потоковом с msgpack использует MSGPACK_DEFINE, то писать на msgpack-структуру :: sbuffer (и отправить его). макрос MSGPACK_DEFINE жалуется, что, возможно, я пропустил «->», поэтому я предполагаю, что он не обнаруживает, что это указатель.

Умные указатели, кажется, работает, хотя:

struct MyStruct { 
    std::string   name{""}; 
    std::shared_ptr<int> val{nullptr}; 

    MSGPACK_DEFINE(name, val); 
}; 

Проблема заключается в том, что приемник на другом конце необходимо Вэл быть сырым указателем. Я хотел бы сделать это без преобразования на принимающей стороне. Есть идеи?

ответ

0

Вы не смогли объяснить, почему вы хотите это сделать. Указатели никогда не имеют смысла при сериализации (в противном случае это данные в процессе, и сериализация не требуется).

Просто передайте значение, на которое указывает указатель. Если вам нужно представить «число или NULL», тогда передайте структуру, содержащую целое число и логическое значение.

struct NullableInt { 
    int value{0}; 
    bool null{true}; 
}; 
+0

Это был простой пример. На практике это на самом деле указатель на другие структуры. Я посылаю древовидную структуру. Я в порядке с его сериализацией (каким-то образом), но не знаю о каком-либо макросы msgpack, который может работать, или об этом. Я думаю, что ответ представляет собой более простую структуру на заднем конце, а затем выполняет все магические действия с исходными указателями на принимающей стороне. –

+0

Повторю: указатели никогда не имеют смысла при сериализации. –

+0

Позвольте мне прояснить это: мне интересно, может ли макрос разыменовать указатель и сериализовать его для меня каким-то значимым образом. Если он обернут в shared_ptr, он отлично работает. –