#include <iostream>
#include <map>
using namespace std;
template <typename T>
T default_value() { return {}; }
template <>
const char* default_value<const char*>() { return "default"; }
template <typename T1, typename T2>
T2 mapGetByKey(std::map<T1, T2>& map, T1 key, T2 defaultValue=default_value<T2>())
{
auto it = map.find(key);
if (it != map.end())
{
return it->second;
}
return defaultValue;
};
int main() {
std::map<int, float> m1;
std::map<int, const char*> m2;
cout << mapGetByKey(m1, 0) << endl;
cout << mapGetByKey(m2, 0) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgIAp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KVCBkZWZhdWx0X3ZhbHVlKCkgeyByZXR1cm4ge307IH0KdGVtcGxhdGUgPD4KY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZTxjb25zdCBjaGFyKj4oKSB7IHJldHVybiAiZGVmYXVsdCI7IH0KdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KVDIgbWFwR2V0QnlLZXkoc3RkOjptYXA8VDEsIFQyPiYgbWFwLCBUMSBrZXksIFQyIGRlZmF1bHRWYWx1ZT1kZWZhdWx0X3ZhbHVlPFQyPigpKQp7CiAgICBhdXRvIGl0ID0gbWFwLmZpbmQoa2V5KTsKICAgICAKICAgIGlmIChpdCAhPSBtYXAuZW5kKCkpCiAgICB7CiAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CiAgICB9CiAgICAgCiAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgIAp9OwppbnQgbWFpbigpIHsKICAJc3RkOjptYXA8aW50LCBmbG9hdD4gbTE7CiAgIAlzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBtMjsKICAgCWNvdXQgPDwgbWFwR2V0QnlLZXkobTEsIDApIDw8IGVuZGw7CiAgIAljb3V0IDw8IG1hcEdldEJ5S2V5KG0yLCAwKSA8PCBlbmRsOwogICAJcmV0dXJuIDA7Cn0=