我在调查MsgPack的源代码。在示例中有一个片段:
std::vector<std::string> vec;
vec.push_back("MessagePack");
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, vec);我在/usr/include/msgpack/object.hpp中看到,要打包的对象必须具有方法msgpack_pack:
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的。
发布于 2014-07-30 08:20:43
MessagePack包括对STL的内置支持。
如您所见,src/msgpack/type/vector.hpp为std::vector实现了<<操作符
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.hpp为std::string实现了相同的运算符。
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>没有问题。
https://stackoverflow.com/questions/25009039
复制相似问题