C ++ lambdas ve bunların işlev işaretçilerine örtük dönüşümleriyle oynuyordum. Başlangıç örneğim onları ftw işlevi için geri arama olarak kullanıyordu. Bu beklendiği gibi çalışıyor.
#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;
}
Yakalamaları kullanmak için değiştirdikten sonra:
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;
}
Derleyici hatasını aldım:
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)’
Biraz okuduktan sonra. Yakalamalar kullanan lambdaların örtük olarak işlev işaretçilerine dönüştürülemeyeceğini öğrendim .
Bunun için bir çözüm var mı? "Örtük olarak" dönüştürülemeyecekleri gerçeği, "açıkça" dönüştürülebilecekleri anlamına mı geliyor? (Başarılı olmadan oyuncu seçmeyi denedim). Lambdas kullanarak girişleri bir nesneye ekleyebilmem için çalışma örneğini değiştirmenin temiz bir yolu nedir ?.