У меня есть несколько std::map<some_type, some_other_type>
, и я пытаюсь написать шаблон функции Lookup
, как показано ниже.
Шаблон функции отлично работает, когда ключ является указателем или скаляром, но если ключ std::string
, есть проблемы.
#include <iostream>
#include <map>
// Usage :
// bool valueisinmap = Lookup(themap, thekey, thevalue);
template <typename TK, typename TV>
bool Lookup(std::map<TK, TV>& map, TK key, TV& value)
{
auto it = map.find(key);
if (it != map.end())
{
value = it->second;
return true;
}
else
{
return false;
}
}
int main()
{
std::map<std::string, std::string> m;
m.insert(std::make_pair("2", "two"));
std::string x;
std::string key = "2";
if (Lookup(m, key, x))
std::cout << "OK\n";
if (Lookup(m, "2", x)) // problem here
std::cout << "OK\n";
}
Я понимаю, почему Lookup(m, "2", x)
не делаетt скомпилировать, потому что тип "2"
не std::string
, но есть способ написать шаблон функции, чтобы я мог использовать Lookup(m, "2", x)
, а также Lookup(m, key, x)
, key
как std::string
?
И если да, то возникает второй вопрос:
bool Lookup(std::map<TK, TV>& map, TK key, TV& value)
key
передается по значению, и если тип key
равен std::string
, создается копия. Есть ли способ передать key
по ссылке (или какой-нибудь магии C ++ 14 и плюс) и при этом использовать Lookup(m, "2", x)
?