在 C++/WinRT 中创建 Windows Runtime 委托的敏捷版本,第一部分

The Old New Thing (Raymond Chen) 工具

摘要

本文介绍如何通过将委托包装在 agile_ref 中来在 C++/WinRT 中创建 Windows Runtime 委托的敏捷版本,并承诺在第二部分中提供更多细节。

<p>假设你有一些 C++/WinRT 代码,它从外部源接收一个委托,并且你可能在一个可能不同的 COM 上下文中调用该委托。然而,原始委托可能不是敏捷的。如何创建该委托的敏捷版本呢?</p> <p>简单的方法是将委托包装在 <code>agile_<wbr />ref</code> 中,然后在需要调用时再将 <code>agile_<wbr />ref</code> 解析回委托。</p> <pre>template&lt;typename Delegate&gt; Delegate make_agile_delegate(Delegate const&amp; d) { return [agile = winrt::agile_ref(d)](auto&amp;&amp;...args) { return agile.get()(std::forward&lt;decltype(args)&gt;(args)...); }; } </pre> <p>但如果这么简单,我们为什么要把这篇文章叫做&#8220;第一部分&#8221;呢?</p> <p>更多内容请见第二部分。</p> <p>本文《<a href="https://devblogs.microsoft.com/oldnewthing/20260720-00/?p=112545">在 C++/WinRT 中创建 Windows Runtime 委托的敏捷版本,第一部分</a>》首发于 <a href="https://devblogs.microsoft.com/oldnewthing">The Old New Thing</a>。</p>
查看原文
查看缓存全文

缓存时间: 2026/07/20 21:26

# 在 C++/WinRT 中创建 Windows 运行时委托的敏捷版本,第 1 部分 - 旧事新说 来源:https://devblogs.microsoft.com/oldnewthing/20260720-00?p=112545 假设你有一段 C++/WinRT 代码,从外部源接收一个委托,并且你可能需要在不同的 COM 上下文中调用该委托。然而,原始的委托可能不是敏捷的。如何创建该委托的敏捷版本?简单的方法是将委托包装在 `agile_ref` 中,然后在需要调用时再将 `agile_ref` 解析回委托。 `` template Delegate make_agile_delegate(Delegate const& d) { return [agile = winrt::agile_ref(d)](auto&&...args) { return agile.get()(std::forward(args)...); }; } `` 但如果真的这么简单,我们为什么还要把这篇文章称为“第 1 部分”呢?更多内容请见第 2 部分。 ### 分类 ### 主题 ## 作者 Raymond Chen Raymond 参与 Windows 发展已有 30 多年。2003 年,他创办了一个名为“The Old New Thing”的网站,其受欢迎程度远超他最狂野的想象,这一发展至今仍让他感到毛骨悚然。该网站后来催生了一本书,巧合的是,书名也是《The Old New Thing》(Addison Wesley 2007)。他偶尔会出现在 Windows Dev Docs 的 Twitter 账号上,讲述一些不传递任何有用信息的故事。

相似文章