我正在研究这段代码并想了解它是如何工作的。(刚刚写了足够的代码来提出我的问题。)
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)> ,还是无关紧要?
它就像在函数调用中传递的所有其他参数一样传递,就在这里:
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)
这里的所有都是它的。