如何定义一个模板化函数,该函数使用映射和lambda按值搜索映射对
How can I define a templated function which takes a map and a lambda to search map-pair by value?
我目前拥有的是:
std::find_if(mmap.begin(), mmap.end(),
[streamShm](const std::pair<int, StreamMapContainer> pair) {
return pair.second.pcktRefShm->id() == streamShm->id();
});
我想把它重构成一个模板化的函数,像这样(.cpp文件(:
template<template <typename...> class Map, typename K, typename T, typename Lambda>
typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda) {
return std::find_if(map.begin(), map.end(), lambda);
}
这样我就可以打电话给了
findMapPairByValue(mmap, [streamShm](const std::pair<int, StreamMapContainer> pair) {
return pair.second.pcktRefShm->id() == streamShm->id();
});
我在头文件中将函数声明为extern
template<template <typename...> class Map, typename K, typename T, typename Lambda>
extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
但是上面的函数没有编译:
warning: 'findMapPairByValue' initialized and declared 'extern'
31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
| ^~~~~~~~~~~~~~~~~~
/.hpp:31:71: error: expected nested-name-specifier before 'const'
31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
| ^~~~~
/.hpp:31:71: error: expected '(' before 'const'
31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
| ^~~~~
| (
/.hpp:31:85: error: expected primary-expression before '>' token
31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
| ^
/.hpp:31:88: error: 'map' was not declared in this scope; did you mean 'std::map'?
31 | extern typename Map<K, T>::const_iterator findMapPairByValue(typename const Map<K, T> &map, const Lambda &lambda);
| ^~~
| std::map
函数的大部分内容都是正确的。您只是在参数列表中错误地使用了typename
template<template <typename...> class Map, typename K, typename T, typename Lambda>
typename Map<K, T>::const_iterator findMapPairByValue(const Map<K, T> &map, const Lambda &lambda) {
return std::find_if(map.begin(), map.end(), lambda);
}
此外,值得注意的是,模板函数定义应该放在头文件中,而不是放在*.cpp文件中
相关文章:
- 将函数类成员映射到类本身内部
- 使用std::函数映射对象方法
- 内联映射初始化的动态atexit析构函数崩溃
- 从函数角度看ID到文件路径的内部与外部映射
- C++ 已停止工作静态映射函数
- C++中的映射函数
- 从 lambda 内部返回 C++11 中的 lambda 类型(平面映射函数)
- 如何将值传递给MFC消息映射函数on_command
- 创建高阶映射函数时,应该使用指针、引用或值
- 什么是 C++ 中的映射函数
- 使用变量参数映射函数并通过字符串 c++ 调用
- OpenCV 3.1 重映射函数类型值错误
- std::映射函数指针
- 在一个简单的映射函数中避免IF
- 相当于使用lambda的python映射函数
- 更好的数据结构映射函数与多个参数(键)
- 使用 c++11 构造映射函数
- 反向映射函数关系(c++)
- 类C++中的映射函数
- c++映射函数中的向量相等