Eu estava brincando com lambdas C ++ e sua conversão implícita em ponteiros de função. Meu exemplo inicial foi usá-los como retorno de chamada para a função ftw. Isso funciona conforme o esperado.
#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;
}
Depois de modificá-lo para usar capturas:
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;
}
Recebi o erro do compilador:
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)’
Depois de alguma leitura. Aprendi que lambdas usando capturas não podem ser convertidos implicitamente em ponteiros de função.
Existe uma solução alternativa para isso? O fato de não poderem ser convertidos "implicitamente" significa que podem ser convertidos "explicitamente"? (Tentei lançar, sem sucesso). Qual seria uma maneira limpa de modificar o exemplo de trabalho para que eu pudesse anexar as entradas a algum objeto usando lambdas ?.
void *
). Se a biblioteca que você está usando permitir esse argumento extra, você encontrará uma solução alternativa. Do contrário, você não tem como conseguir de forma limpa o que deseja fazer.