我在玩 C++ lambda 及其到函数指针的隐式转换。我的开始示例是使用它们作为 ftw 函数的回调。这按预期工作。
#include <ftw.h>
#include <iostream>
using namespace std;
int main()
{
auto callback = [](const char *fpath, const struct stat *sb,
int typeflag) -> int {
cout << fpath << endl;
return 0;
};
int ret = ftw("/etc", callback, 1);
return ret;
}
修改它以使用捕获后:
int main()
{
vector<string> entries;
auto callback = [&](const char *fpath, const struct stat *sb,
int typeflag) -> int {
entries.push_back(fpath);
return 0;
};
int ret = ftw("/etc", callback, 1);
for (auto entry : entries ) {
cout << entry << endl;
}
return ret;
}
我得到了编译器错误:
error: cannot convert ‘main()::<lambda(const char*, const stat*, int)>’ to ‘__ftw_func_t {aka int (*)(const char*, const stat*, int)}’ for argument ‘2’ to ‘int ftw(const char*, __ftw_func_t, int)’
经过一番阅读。我了解到使用捕获的 lambda 不能隐式转换 为函数指针。
有解决方法吗?它们不能“隐式”转换的事实是否意味着它们可以“显式”转换? (我尝试铸造,但没有成功)。什么是修改工作示例的干净方法,以便我可以使用 lambdas 将条目附加到某个对象?
原文由 duncan 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于捕获 lambda 需要保留状态,因此实际上并没有简单的“解决方法”,因为它们 不仅仅是 普通函数。函数指针的关键在于它指向一个单一的全局函数,并且这个信息没有状态的空间。
最接近的解决方法(基本上放弃状态)是提供某种类型的全局变量,可以从您的 lambda/函数访问。例如,您可以创建一个传统的仿函数对象并给它一个静态成员函数,该函数引用一些唯一的(全局/静态)实例。
但这有点违背了捕获 lambdas 的全部目的。