gpt4 book ai didi

c++ - 如何定义一个以捕获为参数的 lambda 函数?

转载 作者:行者123 更新时间:2023-12-04 13:07:04 28 4
gpt4 key购买 nike

我有这个返回 true 的函数如果列表中的任何元素与给定的 predicate 匹配

bool _any(bool (*predicate)(MyStructure), list<MyStructure> arr)
{
for (int i = 0; i < arr.size(); i++)
{
if (predicate(arr.front()))
return true;
arr.pop_front();
}
return false;
}
这适用于非常简单的 lambda,但如果给定的 lambda 需要捕获 this然后我有一个错误,我不知道如何解决。
Assert::IsTrue(_any(
[this](MyStructure t)
{
return t._name == "NAME_SEARCHED" &&
t._type == "TYPE_SEARCHED" &&
_any([](OtherStruct o) { return o._name == "SEARCHED_2"; }, t._children);
},
myList));
错误:
cannot convert argument 1 from 'UTests::<lambda_e8bda0383e9f0c2ae44be631a7424852>' 
to 'bool (__cdecl *)(MyNameSpace::MyStructure)'
(注意: _any 也定义了 OtherStruct)。

最佳答案

您不能将有状态的 lambda 转换为函数指针!
问题是,_any函数需要输入 函数指针类型 bool (*)(MyStructure) 不是 lambda 功能。您可以将 lambda 转换为函数指针,如果它是一个无捕获的 lambda。
也就是说,这里

Assert::IsTrue(_any(
[this](MyStructure t)
//^^^^ ---> capture the "this"
{
// ...
},
myList));
您正在尝试将 lambda 函数(捕获实例)转换为 typed function pointer .
这是不可能的,因此,编译器错误。

I can't figure out how to fix.


制作 _any一个模板函数,以便编译器可以为您进行推导。
template<typename Callable>
bool _any(Callable predicate, std::list<MyStructure> const& arr)
{
// ...
return false;
}
或使用 std::function , with some type erasure overhead
#include <functional> // std::function

bool _any(std::function<bool(MyStructure)> const& predicate
, std::list<MyStructure> const& arr)
{
// ...
return false;
}

关于c++ - 如何定义一个以捕获为参数的 lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68907333/

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