Saya bermain dengan C ++ lambda dan konversi implisitnya ke fungsi pointer. Contoh awal saya menggunakannya sebagai callback untuk fungsi ftw. Ini bekerja seperti yang diharapkan.
#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;
}
Setelah mengubahnya untuk menggunakan tangkapan:
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;
}
Saya mendapat kesalahan kompiler:
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)’
Setelah membaca. Saya belajar bahwa lambda menggunakan penangkapan tidak dapat secara implisit dikonversi ke pointer fungsi.
Apakah ada solusi untuk ini? Apakah fakta bahwa mereka tidak dapat dikonversi "secara implisit" berarti bahwa mereka dapat "secara eksplisit" dikonversi? (Saya mencoba casting, tapi tidak berhasil). Apa cara yang bersih untuk memodifikasi contoh kerja sehingga saya bisa menambahkan entri ke beberapa objek menggunakan lambdas ?.