Невозможно передать вектор лямбда-функции - PullRequest
0 голосов
/ 05 мая 2020

Я не могу передать свой вектор в свою лямбда-функцию.

Мне не хватает чего-то простого?

Спасибо.

std::vector<Wnd_S> GetWindows()
{
    std::vector<Wnd_S> vRet;

    ::EnumWindows(static_cast<WNDENUMPROC>([vRet](HWND hWnd, LPARAM lParam) -> BOOL {

        char buffer[255];
        GetClassNameA(hWnd, buffer, sizeof buffer);
        if (std::string(buffer) == "Wnd" ||
            std::string(buffer) == "Wnd2")
            vRet.push_back({ hWnd, buffer });

        return TRUE;

        }), 0);

    return vRet;
}

1 Ответ

3 голосов
/ 05 мая 2020

Захват лямбда-выражений нельзя преобразовать в указатели на функции, поэтому вы не можете захватить vRet. Но EnumWindows принимает второй параметр, который затем передается функции обратного вызова. Вы можете использовать его для передачи vRet в ваш обратный вызов:

std::vector<Wnd_S> GetWindows() {
    std::vector<Wnd_S> vRet;

    ::EnumWindows([](HWND hWnd, LPARAM lParam) -> BOOL {
        auto& vRet = *reinterpret_cast<std::vector<Wnd_S>*>(lParam);
           // ...
    }, reinterpret_cast<LPARAM>(&vRet));

    return vRet;
}
...