Tôi đã chơi với lambdas C ++ và sự chuyển đổi ngầm của chúng thành con trỏ hàm. Ví dụ ban đầu của tôi là sử dụng chúng làm lệnh gọi lại cho hàm ftw. Điều này hoạt động như mong đợi.
#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;
}
Sau khi sửa đổi nó để sử dụng chụp:
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;
}
Tôi gặp lỗi trình biên dịch:
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)’
Sau khi đọc một số. Tôi đã biết rằng lambdas sử dụng chụp không thể được chuyển đổi hoàn toàn thành con trỏ hàm.
Có một cách giải quyết cho điều này? Thực tế là chúng không thể được chuyển đổi "ngầm" có nghĩa là chúng có thể được chuyển đổi "rõ ràng" không? (Tôi đã thử casting, nhưng không thành công). Cách tốt nhất để sửa đổi ví dụ làm việc để tôi có thể nối các mục vào một số đối tượng bằng lambdas là gì ?.