簡體   English   中英

如何定義一個模板化的 function ,它需要一個 map 和一個 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();
                                    });

我想將其重構為模板化的 function,如下所示(.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();
});

我在 header 文件中將 function 聲明為外部:

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);

但是上面的 function 不能編譯:

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

function的主體大部分是對的。 您只是在參數列表中錯誤地使用了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);
}

另外值得注意的是模板 function 定義應該放在 header 文件中,而不是放在 *.cpp 文件中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM