如何定义一个模板化函数,该函数使用映射和lambda按值搜索映射对

How can I define a templated function which takes a map and a lambda to search map-pair by value?

本文关键字:映射 函数 搜索 lambda 定义 何定义 一个      更新时间:2024-05-09

我目前拥有的是:

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文件中