我在玩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将条目追加到某个对象?
void *
)来完成的。如果您正在使用的库允许使用此额外参数,则将找到一种解决方法。否则,您将无法完全实现您想要的工作。