mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-31 08:09:04 +02:00
demonstrate the motivation behind the previous patch
This commit is contained in:
parent
7191a3b014
commit
9a2bb0c972
@ -23,6 +23,16 @@ struct my {
|
|||||||
my(int a):a(a) {}
|
my(int a):a(a) {}
|
||||||
int a;
|
int a;
|
||||||
MSGPACK_DEFINE(a);
|
MSGPACK_DEFINE(a);
|
||||||
|
|
||||||
|
bool operator==(const my & other) const
|
||||||
|
{
|
||||||
|
return other.a == a;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<(const my & other) const
|
||||||
|
{
|
||||||
|
return other.a > a;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace msgpack {
|
namespace msgpack {
|
||||||
@ -48,4 +58,34 @@ int main() {
|
|||||||
msgpack::object obj(m1, z);
|
msgpack::object obj(m1, z);
|
||||||
std::cout << obj << std::endl;
|
std::cout << obj << std::endl;
|
||||||
assert(m1.a == obj.as<my>().a);
|
assert(m1.a == obj.as<my>().a);
|
||||||
|
|
||||||
|
// useful keys for maps do not have as<>() method implemented:
|
||||||
|
std::cout << "has_as<int> " << msgpack::has_as<int>::value << std::endl;
|
||||||
|
std::cout << "has_as<string> " << msgpack::has_as<std::string>::value << std::endl;
|
||||||
|
|
||||||
|
// BEFORE PATCH: as a result as<map<K, V> >() is not available either.
|
||||||
|
// AFTER PATCH: as<map<K, V> >() is available if key OR value have an as<>() implementation
|
||||||
|
std::cout << "has_as<std::map<int, my> > " << msgpack::has_as<std::map<int, my> >::value << std::endl;
|
||||||
|
|
||||||
|
std::map<int, my> m;
|
||||||
|
m.emplace(1, my(17));
|
||||||
|
msgpack::object obj2(m, z);
|
||||||
|
std::cout << obj2 << std::endl;
|
||||||
|
|
||||||
|
// BEFORE PATCH: this makes the following break with a compiler error,
|
||||||
|
// beacuse it uses the deleted my:my() constructor, as it falls back to the
|
||||||
|
// convert() method.
|
||||||
|
// AFTER PATCH: the following works and uses the customary as() implementation
|
||||||
|
assert(m == obj2.as<decltype(m)>());
|
||||||
|
|
||||||
|
std::map<my, int> m2;
|
||||||
|
m2.emplace(17, 42);
|
||||||
|
msgpack::object obj3(m2, z);
|
||||||
|
std::cout << obj3 << std::endl;
|
||||||
|
|
||||||
|
// BEFORE PATCH: this makes the following break with a compiler error:
|
||||||
|
// beacuse it uses the deleted my:my() constructor, as it falls back to the
|
||||||
|
// convert() method.
|
||||||
|
// AFTER PATCH: the following works and uses the customary as() implementation
|
||||||
|
assert(m2 == obj3.as<decltype(m2)>());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user