我正在研究 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 使用捕获无法隐式转换到函数指针。
有解决方法吗?它们不能“隐式”转换的事实是否意味着它们可以“显式”转换? (我尝试铸造,但没有成功)。什么是修改工作示例的干净方法,以便我可以使用 lambda 将条目附加到某个对象?