首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法理解MsgPack如何打包数据

无法理解MsgPack如何打包数据
EN

Stack Overflow用户
提问于 2014-07-29 06:00:23
回答 1查看 206关注 0票数 0

我在调查MsgPack的源代码。在示例中有一个片段:

代码语言:javascript
复制
std::vector<std::string> vec;    
vec.push_back("MessagePack");
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, vec);

我在/usr/include/msgpack/object.hpp中看到,要打包的对象必须具有方法msgpack_pack:

代码语言:javascript
复制
template <typename Stream, typename T>
inline packer<Stream>& operator<< (packer<Stream>& o, const T& v)
{
    return detail::packer_serializer<Stream, T>::pack(o, v);
}

namespace detail {
template <typename Stream, typename T>
struct packer_serializer {
        static packer<Stream>& pack(packer<Stream>& o, const T& v) {
                v.msgpack_pack(o);
                return o;
        }
};
}

因此,我无法理解编译器是如何允许将std::vector传递给msgpack::pack的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-30 08:20:43

MessagePack包括对STL的内置支持。

如您所见,src/msgpack/type/vector.hppstd::vector实现了<<操作符

代码语言:javascript
复制
template <typename Stream, typename T>
inline packer<Stream>& operator<< (packer<Stream>& o, const std::vector<T>& v)
{
    o.pack_array(v.size());
    for(typename std::vector<T>::const_iterator it(v.begin()), it_end(v.end());
            it != it_end; ++it) {
        o.pack(*it);
    }
    return o;
}

src/msgpack/type/string.hppstd::string实现了相同的运算符。

代码语言:javascript
复制
template <typename Stream>
inline packer<Stream>& operator<< (packer<Stream>& o, const std::string& v)
{
    o.pack_raw(v.size());
    o.pack_raw_body(v.data(), v.size());
    return o;
}

因此,打包std::vector<std::string>没有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25009039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档