Я грав з лямбдами C ++ та їх неявним перетворенням на покажчики функцій. Мій початковий приклад - використання їх як зворотного виклику для функції 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)’
Почитавши. Я дізнався, що лямбди, що використовують захоплення, не можуть неявно перетворюватися на покажчики функцій.
Чи є для цього обхідне рішення? Чи той факт, що їх не можна "неявно" перетворити, означає, що вони можуть "явно" перетворити? (Я спробував кастинг, але безуспішно). Що було б чистим способом модифікувати робочий приклад, щоб я міг додавати записи до якогось об’єкта за допомогою лямбда ?.