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