#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;
}