C ++将lambda作为带有参数列表的函数参数传递
C++ Passing lambda as function parameter with argument list
目前,我正在尝试在 class 中构建类似 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 suitable conversion function from... to... 并尝试搜索以前的问题并查看函数如何 std::for_each 工作,但不能使头或脚趾。谢谢
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;}
}
}
目前,我正在尝试在 class 中构建类似 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 suitable conversion function from... to... 并尝试搜索以前的问题并查看函数如何 std::for_each 工作,但不能使头或脚趾。谢谢
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;}
}
}