C++ лямбды с захватом в качестве указателя функции

Я играл с ламбдами 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)’

После некоторого чтения. Я узнал, что лямбды, использующие captures не могут быть неявно преобразованы в указатели функций.

Есть ли обходной путь для этого? Означает ли тот факт, что они не могут быть "неявно" преобразованы, что они могут быть "явно" преобразованы? (Я пробовал приводить, но безуспешно). Каков был бы чистый способ модифицировать рабочий пример, чтобы я мог добавлять записи к некоторому объекту, используя лямбды?

83
задан duncan 21 October 2011 в 16:00
поделиться