станд :: функция прием параметров - PullRequest
0 голосов
/ 21 января 2020

Я изучаю этот код и хочу понять, как он работает. (Просто написал достаточно кода для составления моего вопроса.)

class AppWindow
{
    enum InitializeWebViewFlags
    {
        kDefaultOption = 0,
        kUseInstalledBrowser = 1 << 0,
    };
    void InitializeWebView(InitializeWebViewFlags webviewInitFlags);
    void RunAsync(std::function<void(void)> callback);
    ...
};

void AppWindow::RunAsync(std::function<void()> callback)
{
    auto* task = new std::function<void()>(callback);
    PostMessage(m_mainWindow, s_runAsyncWindowMessage, reinterpret_cast<WPARAM>(task), 0);
}

AppWindow::AppWindow()
{
    ...
    RunAsync([this] { InitializeWebView(kDefaultOption); });
}

...  /* msg handler */ 
case s_runAsyncWindowMessage:
{
    auto* task = reinterpret_cast<std::function<void()>*>(wParam);
    (*task)();
     delete task;
     return true;
}

Почему / как передается значение enum в InitilizeWebView ()? Даже если std :: function объявлена ​​как std :: function , без параметров, она сохраняет и передает значение параметра? Это происходит только с одним параметром? (Не пробовал больше, но передается один параметр, я проверил). Разве правильное объявление не будет std :: function или std :: function для этого случая, или это не имеет значения?

1 Ответ

5 голосов
/ 21 января 2020

Он передается так же, как и любой другой аргумент, который передается в вызове функции, прямо здесь:

RunAsync([this] { InitializeWebView(kDefaultOption); });

Это замыкание, которое вызывает InitializeWebView() с параметром. В этом нет абсолютно ничего необычного.

Но то, что передается RunAsync(), - это лямбда, которая не требует аргументов. Который отлично конвертируется в std::function<void ()>. Эта лямбда не принимает аргументов и возвращает void, что делает ее конвертируемой в std::function<void ()>. И когда он вызывается, он вызывает InitializeWebView() с параметром.

Это очень похоже (но не совсем логически эквивалентно лямбда-выражению в коде из-за захвата `this) в:

void call_initialize()
{
    InitializeWebView(kDefaultOption);
}

// ....

    RunAsync(call_initialize);

Вот и все, что нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...