std::function<void()> 接受参数

Chr*_*y78 0 c++ winapi

我正在研究这段代码并想了解它是如何工作的。(刚刚写了足够的代码来提出我的问题。)

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;
}
Run Code Online (Sandbox Code Playgroud)

为什么/如何将枚举值传递给 InitilizeWebView() ?即使 std::function 被声明为 std::function< void > ,没有参数,它会保留并传递参数值吗?这仅发生在一个参数上?(没有尝试更多,但正在传递一个参数,我检查过)。在这种情况下,正确的声明不是 std::function< void(InitializeWebViewFlags)> 或 std::function< void(int)> ,还是无关紧要?

Sam*_*hik 5

它就像在函数调用中传递的所有其他参数一样传递,就在这里:

RunAsync([this] { InitializeWebView(kDefaultOption); });
Run Code Online (Sandbox Code Playgroud)

这是一个InitializeWebView()带参数调用的闭包。这绝对没有什么不寻常的。

但是传递给的RunAsync()是一个不带参数的 lambda。完全可以转换为std::function<void ()>. 这个 lambda 恰好没有参数,并返回 a void,这使得它可以转换为std::function<void ()>。当它被调用时,它会调用InitializeWebView()一个参数。

这与代码中的 lambda 非常相似(但在逻辑上并不完全等同于代码中的 lambda,因为它捕获了 `this):

void call_initialize()
{
    InitializeWebView(kDefaultOption);
}

// ....

    RunAsync(call_initialize);
Run Code Online (Sandbox Code Playgroud)

这里的所有都是它的。