0

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 に渡す方法を理解できません。

4

1 に答える 1

0

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、 a に対して同じ演算子を実装します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>

于 2014-07-30T08:20:43.133 に答える