2013-02-09 3 views
4

Есть ли способ в MsgPack C++ использовать MSGPACK_DEFINE без изменения членов класса? Мы хотели бы сохранить материал пакета сообщений из заголовков и использовать его только внутри библиотеки.Использование MSGPACK_DEFINE без изменения объявлений классов

Кажется, что только упаковка каждого класса будет работать, но я надеюсь, что есть лучший способ.

ответ

2

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/.

Смежные вопросы