5

MsgPack C++ で、クラス メンバーを変更せずに MSGPACK_DEFINE を使用する方法はありますか? メッセージ パックのものはヘッダーから除外し、ライブラリ内でのみ使用したいと考えています。

各クラスをラップするだけでうまくいくようですが、もっと良い方法があることを願っています。

4

1 に答える 1

2

UPDMSGPACK_DEFINE_EXTERNALまたは、私が書いたマクロを使用することもできます。

.hpp.erbソースはここから入手でき、生成されたものはここから入手できます.hpp

だけで、シリアル化/逆シリアル化するクラスとそのメンバーを渡して#include "define_external.hpp"呼び出します。MSGPACK_DEFINE_EXTERNAL

例えば:

MSGPACK_DEFINE_EXTERNAL(v3f, X, Y, Z);

このヘッダー ファイルが gcc 4.8.2、clang 3.3、および MSVC 2010 で動作することをテストしました。


私のプロジェクトでこれを達成するために、 と を定義operator>>operator<<ました。これは を使用するほど単純ではありませんMSGPACK_DEFINEが、機能します。

namespace msgpack {

inline v3f& operator>> (object o, v3f& v)
{
    if(o.type != type::ARRAY) { throw type_error(); }
    if(o.via.array.size != 3) { throw type_error(); }
    o.via.array.ptr[0].convert(&v.X);
    o.via.array.ptr[1].convert(&v.Y);
    o.via.array.ptr[2].convert(&v.Z);
    return v;
}

template <typename Stream>
inline packer<Stream>& operator<< (packer<Stream>& o, const v3f& v)
{
    o.pack_array(3);
    o.pack(v.X);
    o.pack(v.Y);
    o.pack(v.Z);
    return o;
}

}

でさらに例を見つけることができますsrc/msgpack/type/

于 2014-01-13T00:13:30.807 に答える