Я играл с лямбдами 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)’
После некоторого чтения. Я узнал, что лямбда-выражения, использующие захват, не могут быть неявно преобразованы в указатели на функции.
Есть ли обходной путь для этого? Означает ли тот факт, что они не могут быть преобразованы «неявно», что они могут быть преобразованы «явно»? (Я пробовал кастинг, но безуспешно). Каким будет чистый способ изменить рабочий пример, чтобы я мог добавлять записи к какому-либо объекту с помощью лямбда-выражений?