Stavo giocando con i lambda C ++ e la loro conversione implicita in puntatori a funzione. Il mio esempio iniziale li stava usando come callback per la funzione ftw. Funziona come previsto.
#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;
}
Dopo averlo modificato per utilizzare le acquisizioni:
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;
}
Ho ricevuto l'errore del compilatore:
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)’
Dopo un po 'di lettura. Ho imparato che i lambda che utilizzano le acquisizioni non possono essere convertiti implicitamente in puntatori a funzione.
C'è una soluzione alternativa per questo? Il fatto che non possano essere convertiti "implicitamente" significa che possono essere convertiti "esplicitamente"? (Ho provato il casting, senza successo). Quale sarebbe un modo pulito per modificare l'esempio funzionante in modo da poter aggiungere le voci a qualche oggetto usando lambda ?.
void *
). Se la libreria che stai utilizzando consente questo argomento aggiuntivo, troverai una soluzione alternativa. Altrimenti, non hai modo di ottenere in modo pulito ciò che vuoi fare.