C++ msgpack:在不知道类型的情况下解包自定义类

C++ msgpack:在不知道类型的情况下解包自定义类,c++,msgpack,C++,Msgpack,这是我打包和解包已知类的代码片段: MessageCoffeeIsReady input(1, "Black coffee is ready"); // ---- Serialize to buffer msgpack::sbuffer sbuf; msgpack::pack(sbuf, input); // ---- Send over line... // ---- Unpack received buffer msgpack::object_handle oh = msgpack::

这是我打包和解包已知类的代码片段:

MessageCoffeeIsReady input(1, "Black coffee is ready");

// ---- Serialize to buffer
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, input);

// ---- Send over line...

// ---- Unpack received buffer
msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size());
msgpack::object        obj = oh.get();

// ---- Convert to message
MessageCoffeIsReady result; // <- How do i know the msgpack::object contains `MessageCoffeIsReady`?
obj.convert(result);
我的问题是:我如何知道我收到了
messagecoffiesready
类型的消息


是否有任何内部typeid可用于转换为特定类?

MsgPack是一种类似JSON的格式,其协议中不支持用户定义的类型。使用
MSGPACK\u DEFINE
宏时,它只是映射

但是,您仍然可以添加自己的类型标记来支持类似于歧视联合的东西。这不允许您识别任何任意对象,但是如果您只计划发送几种类型的对象中的一种,那么它非常适合

struct Any {
    std::string type;
    msgpack::object data;
    MSGPACK_DEFINE(type, data);
};
它存储了一个对象和一个字符串(类型)来标识该对象。然后可以将对象打包到其中:

structfoo{
INTA;
std::字符串b;
MSGPACK_定义(a,b);
};
结构条{
双c;
MSGPACK_DEFINE(c);
};
/* ... */
auto-foo=Any{“foo”,msgpack::object(foo{42,“hi”},z)};
auto foo_obj=msgpack::object(foo,z);
自动条=任意{“条”,msgpack::object(条{25.5},z)};
auto bar_obj=msgpack::object(bar,z);
要想把东西拿出来,先把它转换成any。然后根据标记转换为不同的类型:

<代码>任何; 对象转换(任何); 如果(any.type==“foo”){ 富富,; any.data.convert(foo);
std::我是否需要“z”(区域)?我收到以下警告:“未定义对`msgpack::v1::adapter::object::operator()(msgpack::v2::object&,Foo const&)const'的引用”。谢谢。我相信是这样。
z
在这个例子中是一个msgpack::zone,它为对象分配并拥有内存。只要将
msgpack::zone z;
粘贴在范围的顶部,你就可以很好地使用它了!@parktomatomi,非常灵活的解决方案,谢谢!你可以使用(std或boost)做类似的事情变量。这是一个boost变量示例。注意:
boost::typeindex::type_id()。pretty_name()
是实现定义的。
struct Any {
    std::string type;
    msgpack::object data;
    MSGPACK_DEFINE(type, data);
};