UPD. В качестве альтернативы вы можете использовать MSGPACK_DEFINE_EXTERNAL
макрос, который я написал.
Номер источника: .hpp.erb
Источник информации: here, и сгенерировано .hpp
is here.
Например:
MSGPACK_DEFINE_EXTERNAL(v3f, X, Y, Z);
Я проверил этот заголовочный файл для работы с GCC 4.8.2, лязг 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/
.