私は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)’
いくつか読んだ後。キャプチャを使用するラムダは、暗黙的に関数ポインターに変換できないことを学びました。
これの回避策はありますか?「暗黙的に」変換できないという事実は、「明示的に」変換できることを意味しますか?(私はキャストを試みましたが、成功しませんでした)。ラムダを使用していくつかのオブジェクトにエントリを追加できるように、作業例を変更するためのクリーンな方法は何ですか?
void *
)を介して行われます。使用しているライブラリでこの追加の引数が許可されている場合は、回避策があります。そうしないと、やりたいことをきれいに達成する方法がありません。