MsgPack C++ で、クラス メンバーを変更せずに MSGPACK_DEFINE を使用する方法はありますか? メッセージ パックのものはヘッダーから除外し、ライブラリ内でのみ使用したいと考えています。
各クラスをラップするだけでうまくいくようですが、もっと良い方法があることを願っています。
MsgPack C++ で、クラス メンバーを変更せずに MSGPACK_DEFINE を使用する方法はありますか? メッセージ パックのものはヘッダーから除外し、ライブラリ内でのみ使用したいと考えています。
各クラスをラップするだけでうまくいくようですが、もっと良い方法があることを願っています。
UPD。MSGPACK_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/
。