gpt4 book ai didi

c++ - C++将lambda用作带有参数列表的函数参数

转载 作者:行者123 更新时间:2023-12-02 09:48:17 25 4
gpt4 key购买 nike

目前,我正在尝试在一个类中构建一个类似于Java的forEach的东西,我传递一个lambda并为每个项目调用它。目前,我已经像这样实现了:
oo

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;
}
我们如何实现这样的目标?我一直在尝试,但是它没有给错误提供从...到...的合适的转换函数,并尝试搜索以前的问题,然后看一下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;}
}
}

关于c++ - C++将lambda用作带有参数列表的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63011099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com