用于接收通用地图作为参数的模板函数
Template function to receive a generic map as a parameter
在很多情况下,我们可能希望对完全相同的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>&)’
我在这篇文章中阅读了有关模板模板的使用。正确的方法是什么?
尝试使用
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;
}
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类