demonstrate the motivation behind the previous patch

This commit is contained in:
Martin C Drohmann 2016-08-23 15:09:02 -07:00
parent 7191a3b014
commit 9a2bb0c972

View File

@ -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)>());
}