c++ macros msgpack

C++ msgpack Clases definidas por el usuario: no se puede iniciar



macros (2)

He estado mirando la guía de inicio rápido de C ++ para msgpack.

http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387

Ahí está el siguiente fragmento de código:

#include <msgpack.hpp> #include <vector> #include <string> class myclass { private: std::string str1; std::string str2; public: MSGPACK_DEFINE(str1,str2); }; int main(void) { std::vector<myclass> vec; // add some elements into vec... ///// /* But what goes here??? */ ///// // you can serialize myclass directly msgpack::sbuffer sbuf; msgpack::pack(sbuf, vec); msgpack::unpacked msg; msgpack::unpack(&msg, sbuf.data(), sbuf.size()); msgpack::object obj = msg.get(); // you can convert object to myclass directly std::vector<myclass> rvec; obj.convert(&rvec); }

Quiero serializar un vector de objetos myclass.

He intentado lo siguiente:

... vector<myclass> rb; myclass mc; ... int main(){ ... mc("hello","world"); rb.push_back(mc) ... }

Pero esto no funciona ("error: no hay coincidencia para la llamada")

también, si lo hago:

mc.str1="hello" mc.str2="world"

no funcionará ya que str1 y str2 son privados.

¿Cómo usar esta macro MSGPACK_DEFINE (...) correctamente? Parece que no puedo encontrar nada en línea.

Muchas gracias,


MSGPACK_DEFINE( ) define algunos métodos para implementar el empaque y desempaquetado de su clase. Lo que coloca dentro () es una lista de los miembros que desea serializar.

Después de eso, puedes empacar y descomprimir tu clase como si empacaras o descomprimases una int . Entonces el ejemplo debería estar funcionando.

Puedes intentar eliminar el vector y empacar solo un objeto, creo que eso lo simplificaría.


class myclass { private: std::string str1; std::string str2; public: myclass(){}; myclass(string s1,string s2):str1(s1),str2(s2){}; MSGPACK_DEFINE(str1,str2); }; int main(int argc, char **argv) { std::vector<myclass> vec; myclass m1("m1","m2"); vec.push_back(m1); // you can serialize myclass directly msgpack::sbuffer sbuf; msgpack::pack(sbuf, vec); msgpack::unpacked msg; msgpack::unpack(&msg, sbuf.data(), sbuf.size()); msgpack::object obj = msg.get(); // you can convert object to myclass directly std::vector<myclass> rvec; obj.convert(&rvec); }