Функция шаблона для получения общей карты в качестве параметра
Там может быть много случаев, когда мы хотим выполнить какую-то операцию на std::map
или std::unordered_map
это точно так же, независимо от типа карты. Давайте рассмотрим следующий пример:
#include <map>
#include <unordered_map>
#include <iostream>
template< template <typename,typename> class Container >
void printMap(Container<int, long> inputMap, bool additionalParam = false)
{
for (const pair<int,long> p : inputMap)
cout<<p.first <<","<< p.second <<std::endl;
}
int main()
{
int a = 1;
long b = 2;
map<int,long> map1;
map1.emplace(a,b);
unordered_map<int,long> map2;
map2.emplace(a,b);
printMap(map1);
printMap(map2);
return EXIT_SUCCESS;
}
Если я пытаюсь скомпилировать пример выше, у меня есть это:
error: no matching function for call to ‘printMap(std::map<int, long int>&)’
Я читал об использовании шаблона в этом посте. Как правильно это сделать?
3 ответа
Попробуй с
template< template <typename...> class Container, typename ... Ts >
void printMap(Container<int, long, Ts...> inputMap,
bool additionalParam = false)
(Большая) проблема в вашем коде заключается в том, что std::map
а также std::unordered_map
являются шаблонными классами с четырьмя (не двумя) шаблонными параметрами. 3-й и 4-й имеют значение по умолчанию, так что вы можете определить std::map
объект как
std::map<int, long> map1;
но с параметром по умолчанию вы определяете его как
std::map<int, long, std::less<int>,
std::allocator<std::pair<const int, long> >> map1;
(PS: или вы можете сделать это просто и использовать auto
как в решении Семена Бурова; +1)
Компилятор не может вывести аргумент шаблона, если вы определите его таким образом. Попробуй использовать:
template<typename Map>
void printMap(const Map& map, bool additionalParam = false) {
for (const auto& p : map)
cout<<p.first <<","<< p.second <<std::endl;
}
Если вам нужно проверить, что Map
это точно Map<int, long int>
, затем добавьте статическое утверждение в тело функции:
static_assert( std::is_same< typename Map::key_type, int >::value &&
std::is_same< typename Map::mapped_type, long >::value, "!");
Попробуй это:
template<class Container>
void printMap(const Container& inputMap)
{
using Key = typename Container::key_type;
using Value = typename Container::mapped_type;
for (const std::pair<Key,Value> p : inputMap)
std::cout << p.first << "," << p.second << std::endl;
}
или еще лучше, просто:
template<class Container>
void printMap(const Container& inputMap)
{
for (const auto& p : inputMap)
std::cout << p.first << ","<< p.second << std::endl;
}