diff --git a/src/msgpack/type/define.hpp.erb b/src/msgpack/type/define.hpp.erb index 011d2281..c8a86512 100644 --- a/src/msgpack/type/define.hpp.erb +++ b/src/msgpack/type/define.hpp.erb @@ -34,6 +34,25 @@ msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \ } +// MSGPACK_ADD_ENUM must be used in the global namespace. +#define MSGPACK_ADD_ENUM(enum) \ + namespace msgpack { \ + template <> \ + inline enum& operator>> (object o, enum& v) \ + { \ + int tmp; \ + o >> tmp; \ + v = static_cast(tmp); \ + return v; \ + } \ + template <> \ + void operator<< (object::with_zone& o, const enum& v) \ + { \ + int tmp = static_cast(v); \ + o << tmp; \ + } \ + } + namespace msgpack { namespace type { diff --git a/test/convert.cc b/test/convert.cc index f2a85237..f579f33a 100644 --- a/test/convert.cc +++ b/test/convert.cc @@ -55,9 +55,11 @@ public: flags_t flag; - MSGPACK_DEFINE((int&)flag); + MSGPACK_DEFINE(flag); }; +MSGPACK_ADD_ENUM(enum_member::flags_t); + TEST(convert, enum_member) { enum_member src;