c++ - 如何在 C++ 中将 lambda 表达式作为参数传递

标签 c++ templates lambda stl

<分区>

我在 C++ 中传递 lambda 表达式时遇到了问题,我无法通过自己搜索解决它。

    template <typename T>
    int count_if(typename linkList<T>::iterator it_start, typename linkList<T>::iterator it_end, bool (*cmp)(T) ){
        int ret = 0;
        while(it_start != it_end){
            if(cmp(*it_start)) ++ret;
            ++it_start;
        }
        return ret;
    }

这是不包含 lambda 表达式的函数。 我可以用下面的句子来得到答案。

 cout << algorithm::count_if(lk.begin(),lk.end(),cmp) << endl;

lk是我自己写的链表,支持“++”“begin”“end”函数或运算符。

但问题是我不能在这个函数中使用 lambda 表达式

 cout << algorithm::count_if(lk.begin(),lk.end(),[](int a)->bool{return a>= 50;})

我想用这句话通过lambda表达式得到答案。 然后我重写了函数。

    template <typename T>
    int count_if(typename linkList<T>::iterator it_start, typename linkList<T>::iterator it_end, std::function<bool (T)> _cmp){
        int ret = 0;
        while(it_start != it_end){
            if(_cmp(*it_start)) ++ret;
            ++it_start;
        }
        return ret;
    }

但是编译失败。 它显示

   candidate template ignored: could not match 'function<bool (type-parameter-0-0)>' against '(lambda at main.cpp:24:53)'
    int count_if(typename linkList<T>::iterator it_start, typename linkList<T>::iterator it_end, std::function<bool (T)> _cmp){

我不知道该怎么做,对这些概念感到困惑。感谢任何解决问题的建议或方法,因为我可以在调用我的函数时使用 lambda 表达式

最佳答案

lambda 是不同于 std::function 的类型。您可以添加另一个模板参数以允许传递任何可调用的(lambda 表达式)作为比较器函数。

template <typename T, typename Predicate>
int count_if(typename linkList<T>::iterator it_start, typename linkList<T>::iterator it_end, Predicate&& cmp ){
    int ret = 0;
    while(it_start != it_end){
        if(cmp(*it_start)) ++ret;
        ++it_start;
    }
    return ret;
}

关于c++ - 如何在 C++ 中将 lambda 表达式作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58007035/

相关文章:

c++ - MSVC++ 2010 Express 链接器错误 LNK2005

c++ - 结构类型转换

c++ - 在 Qt 中使用带有 QSet 和 boost::tuples::tuple 的模板没有匹配错误

codeigniter - 哪个 CMS 会更好地在 CI 的不同页面中加载不同的模板?

c++ - 动态哈希->类标签

python - 最后导入的文件会覆盖以前文件中的语句。指定导入变量的更好方法?

c++ - 获取 OpenCL 内核参数信息

python - jinja flask 和循环属性

java - Aws Lambda 访问 META-INF/MANIFEST.MF?

java - 在 Java 8 中基于列表过滤 HashMap