#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=