Je jouais avec les lambdas C++ et leur conversion implicite en pointeurs de fonction. Mon exemple de départ était de les utiliser comme callback pour la fonction ftw. Cela fonctionne comme prévu.
#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;
}
Après l'avoir modifié pour utiliser les captures :
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;
}
J'ai obtenu l'erreur du compilateur :
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)’
Après quelques lectures. J'ai appris que les lambdas utilisant des captures ne peut pas être converti implicitement à des pointeurs de fonction.
Existe-t-il une solution de contournement ? Le fait qu'ils ne puissent pas être convertis "implicitement" signifie-t-il qu'ils peuvent être convertis "explicitement" ? (J'ai essayé le casting, sans succès). Quelle serait la meilleure façon de modifier l'exemple de travail pour que je puisse ajouter les entrées à un objet en utilisant des lambdas ?