mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-29 23:42:40 +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) {}
|
||||
int 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 {
|
||||
@ -48,4 +58,34 @@ int main() {
|
||||
msgpack::object obj(m1, z);
|
||||
std::cout << obj << std::endl;
|
||||
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