【问题标题】:C++ Passing lambda as function parameter with argument listC ++将lambda作为带有参数列表的函数参数传递
【发布时间】:2020-07-21 09:05:18
【问题描述】:

目前,我正在尝试在一个类中构建类似 Java 的 forEach ,在该类中我传递一个 lambda 并为每个项目调用它。目前我是这样实现的:

Foo.h

class Foo
{
public:
    Foo();
    void forEach(void(*lambda)(Bar*));
private:
    SpecialList mElements;
};

Foo.cpp

#include "Foo.h"

void Foo::forEach(void(*lambda)(Bar*))
{
    for (auto& v : mElements)
    {
        // Try/catch for stopping
        try {lambda(&v.second);}
        catch (int) {break;}
    }
}

main.cpp

int main() {
    Foo foo();
    foo.forEach([](Bar* bar) {
        std::cout << bar->something() << std::endl;
    });
    return 0;
}

它工作得很好,但我希望能够通过引用将元素传递到 lambda 中,以便以后能够像本示例中那样使用:

main.cpp

int main() {
    Foo foo();
    foo.forEach([&var1](Bar* bar) {
        std::cout << var1 << bar->something() << std::endl;
    });
    return 0;
}

我们怎样才能实现这样的目标?我一直在尝试,但它给出了错误 no proper conversion function from... to... 并尝试搜索以前的问题并查看 std::for_each 之类的函数如何工作但不能对此有所了解。谢谢。

【问题讨论】:

  • 看看std::function
  • 您可以使用 from std::function 并将对数据的引用作为另一个参数传递。
  • C++11 提供了这样的功能。看:en.cppreference.com/w/cpp/algorithm/for_each
  • [OT]:最好有void(*func)(Bar&amp;) 而不是void(*func)(Bar*),因为Bar 不能是nullptr

标签: c++ visual-studio function lambda parameter-passing


【解决方案1】:

lambda 不是函数指针。如果它没有捕获到的对象,它可以隐式转换为一个,否则它不能。

一个lambda有一个匿名类型,所以如果你想直接使用这个类型,你需要使用模板:

template<typename Callable>
void Foo::forEach(Callable lambda)
{
    for (auto& v : mElements)
    {
        // Try/catch for stopping
        try {lambda(&v.second);}
        catch (int) {break;}
    }
}

否则,lambda 始终可以转换为 std::function(即使在捕获对象时也是如此),因此您可以这样编写:

void Foo::forEach(std::function<void(Bar*)> lambda)
{
    for (auto& v : mElements)
    {
        // Try/catch for stopping
        try {lambda(&v.second);}
        catch (int) {break;}
    }
}

【讨论】:

  • 嗨,我已经尝试了两种建议,第二个效果很好。
  • @Onelio,首先应该也可以。请注意,您还必须将定义放在头文件中 - 否则您将收到链接器错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2018-10-26
  • 1970-01-01
  • 2012-03-07
  • 2020-09-27
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多