gpt4 book ai didi

c++ - boost::variant 并获取要为 msgpack 编码的数据

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:20 28 4
gpt4 key购买 nike

我正在使用 boost 递归变体来存储我想要使用 msgpack 进行编码的变体数据,为此我需要获取原始数据以传递给 encode() 函数(见下文)。

我在下面的 encode() 函数中尝试了三个不同的选项,但没有用。什么是替代品?

typedef std::vector<boost::recursive_variant_> vector_rvariant_t; 
typedef std::map<std::string, boost::recursive_variant_> map_rvariant_t;

typedef boost::make_recursive_variant <bool, boost::uint8_t, boost::uint32_t,
boost::int32_t, double, std::string, boost::uuids::uuid,
vector_rvariant_t, map_rvariant_t > ::type rvariant_type;

/**
Wrapper class for boost::make_recuverise_variant<>::type
*/
class rvariant {
public:
// encode the _data to msgpack buffer
//NEED HELP for this function.
void encode(msgpack::sbuf& sbuf) {
// msgpack::pack(sbuf, (*type_)data_);
// msgpack::pack(sbuf, boost::get<typeid(data_)>(data_));
// msgpack::pack(sbuf, boost::get<*type_>(data_));
}

// constructor
explicit template <typename T> rvariant(const T& data) {
data_ = data;
type_ = (std::type_info*)&typeid(data);
}

// operator=
template <typename T> rvariant& operator=(const T& data) {
data_ = data;
type_ = (std::type_info*)&typeid(data);
return *this;
}

// get the data
template<typename T> T get() {
return boost::get< T >(data_);
}

private:
rvariant_type data_;
std::type_info* type_;

};

最佳答案

我不认为您使用 std::type_info 的方式可以与 Boost::Variant 一起使用。

想法:

  1. 使用类似于提供的代码 here包装您的电话以编码您自己的标签。通过使用访问者,您实际上将自己限制在 Boost.Variant 库的公共(public)接口(interface)上。备选方案:使用 variant.which

  2. 不要试图利用 boost::variant 的内部标记和数据存储,因为它以后可能会发生变化。请记住,Boost.Variant 可能会根据编译器功能和模板参数的属性(例如,引用类型被特殊处理)以不同方式分配其内部数据。相反,单独编码标签(如第一步),然后单独编码(键入的)数据。

希望对您有所帮助。我想简短的版本是这样的:你的方法虽然比我描述的更直接,但更难正确,因为你依赖于 Variant 的内部结构。

编辑:我查看了 Boost.Serialization 源代码。它可能有帮助:http://svn.boost.org/svn/boost/trunk/boost/serialization/variant.hpp

编辑:为了说明(并使答案更加独立),这是 Boost.Serialization 中的访问者的样子(参见上面的链接):

template<class Archive>
struct variant_save_visitor : boost::static_visitor<> {
variant_save_visitor(Archive& ar) : m_ar(ar) {}

template<class T>
void operator()(T const & value) const {
m_ar << BOOST_SERIALIZATION_NVP(value);
}
private:
Archive & m_ar;
};

关于c++ - boost::variant 并获取要为 msgpack 编码的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5440248/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com