你可以使用 boost::variant 来做到这一点。要实现递归结构,可以使用 oost::make_recursive_variant 如下:
typedef boost::make_recursive_variant<
std::string,
std::map<boost::recursive_variant_, boost::recursive_variant_>,
std::vector<boost::recursive_variant_>,
int,
double
>::type variant_t;
这是一个文档:
http: //www.boost.org/doc/libs/1_55_0/doc/html/variant/tutorial.html#variant.tutorial.recursive.recursive-variant
您还需要编写一个转换器,将 msgpack::object 转换为 variant_t,反之亦然,如下所示:
// Custom converter for variant_t
namespace msgpack {
// Convert from msgpacl::object to variant_t.
inline variant_t& operator>>(object const& o, variant_t& v) {
switch(o.type) {
case type::MAP:
v = std::map<variant_t, variant_t>();
o.convert(boost::get<std::map<variant_t, variant_t> >(&v));
break;
case type::ARRAY:
v = std::vector<variant_t>();
o.convert(boost::get<std::vector<variant_t> >(&v));
break;
case type::POSITIVE_INTEGER:
v = int();
o.convert(boost::get<int>(&v));
break;
case type::DOUBLE:
v = double();
o.convert(boost::get<double>(&v));
break;
case type::RAW:
v = std::string();
o.convert(boost::get<std::string>(&v));
break;
default:
break;
}
return v;
}
// Convert from variant_t to msgpacl::object.
template <typename Stream>
struct packer_imp:boost::static_visitor<void> {
template <typename T>
void operator()(T const& value) const {
o_.pack(value);
}
packer_imp(packer<Stream>& o):o_(o) {}
packer<Stream>& o_;
};
template <typename Stream>
inline packer<Stream>& operator<< (packer<Stream>& o, const variant_t& v)
{
boost::apply_visitor(packer_imp<Stream>(o), v);
return o;
}
} // namespace msgpack
您可以从 gist 获取完整的示例代码:
https ://gist.github.com/redboltz/672c5af16b2907488977
我在示例中使用了 C++11 功能,因此您需要添加 -std=c++11 选项.