通过 C++/WinRT 将值装箱到 IInspectable 和对其取消装箱

  备注

不仅可对标量值进行装箱和取消装箱,而可使用 winrt::box_value 和 winrt::unbox_value 函数对大多数类型的数组进行这类操作(枚举数组除外)

只能使用 winrt::unbox_value_or 函数对标量值取消装箱。

IInspectable 接口是 Windows 运行时 (WinRT) 中每个运行时类的根接口。 这类似于位于每个 COM 接口和类的根处的 IUnknown;而且类似于位于每个通用类型系统类的根处的 System.Object。

换言之,可向任何运行时类的实例传递需要 IInspectable 的函数。 但是你无法将标量值(如数值或文本值)直接传递到此类函数,也不能直接传递数组。 相反,标量或数组值需要封装到引用类对象内。 该封装过程称为对值进行装箱

 重要

不管将什么类型传递给 Windows 运行时 API,都可以对该类型进行装箱和取消装箱操作。 换言之,可以对 Windows 运行时类型这样做。 上面给出的一些示例包括数字值、文本值(字符串)和数组。 另一个示例是在 IDL 中定义的 struct。 如果尝试对常规 C++ struct(未在 IDL 中定义)执行装箱操作,编译器会提醒你只能将 Windows 运行时类型装箱。 运行时类是 Windows 运行时类型,不过,我们当然可以将运行时类传递到 Windows 运行时 API,无需将其装箱。

C++/WinRT 提供了 winrt::box_value 函数,该函数采用标量或数组值,并将装箱的值返回到 IInspectable中 。 对于取消 IInspectable 装箱并返回到标量或数组值,提供 winrt::unbox_value 函数 。 对于取消 IInspectable 装箱并返回到标量值,还提供 winrt::unbox_value_or 函数 。

取消值装箱的示例

LaunchActivatedEventArgs::Arguments 访问器函数返回 winrt::hstring,这是一个标量值。 我们可以将该 hstring 值进行装箱并将其传递到需要 IInspectable 的函数,如下所示。

void App::OnLaunched(LaunchActivatedEventArgs const& e)
{...rootFrame.Navigate(winrt::xaml_typename<BlankApp1::MainPage>(), winrt::box_value(e.Arguments()));...
}

要设置 XAML 按钮的内容属性,请调用 Button::Content 转变器函数。 要将内容属性设置为字符串值,可以使用此代码。

Button().Content(winrt::box_value(L"Clicked"));

首先,hstring 转换构造函数将此字符串参数转换为 hstring。 然后,调用采用 hstring 的 winrt::box_value 的重载。

取消 IInspectable 装箱的示例

在自己的需要 IInspectable 的函数中,可以使用 winrt::unbox_value 取消装箱,也可以使用 winrt::unbox_value_or 通过默认值取消装箱。 还可以使用 try_as 取消装箱到 std::optional。

void Unbox(winrt::Windows::Foundation::IInspectable const& object)
{hstring hstringValue = unbox_value<hstring>(object); // Throws if object is not a boxed string.hstringValue = unbox_value_or<hstring>(object, L"Default"); // Returns L"Default" if object is not a boxed string.float floatValue = unbox_value_or<float>(object, 0.f); // Returns 0.0 if object is not a boxed float.std::optional<int> optionalInt = object.try_as<int>(); // Returns std::nullopt if object is not a boxed int.
}

确定装箱值的类型

如果收到装箱值但不确定它所包含的类型(需要知道类型以便取消装箱),可以查询装箱值的 IPropertyValue 接口,然后对其调用 Type。 下面是代码示例。

WINRT_ASSERT 是宏定义,并且扩展到 _ASSERTE。

float pi = 3.14f;
auto piInspectable = winrt::box_value(pi);
auto piPropertyValue = piInspectable.as<winrt::Windows::Foundation::IPropertyValue>();
WINRT_ASSERT(piPropertyValue.Type() == winrt::Windows::Foundation::PropertyType::Single);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 并发编程 | 并发世界

一、C 并发世界 1、什么是并发&#xff1f; 并发是指两个或更多独立的活动同时发生&#xff0c;计算机中的并发指的是&#xff0c;在单个系统里同时执行多个独立的活动

CSS3动画效果详解

CSS3动画 在CSS3中&#xff0c;animation属性用于实现元素的动画。 animation属性跟transition属性在功能实现上是非常相似的&#xff0c;都是通过改变元素的属性值来实现动画效果。但是&#xff0c;这两者实际上有着本质的区别 对于transition属性来说&#xff0c;它只能将…

前缀数组-截断数组

3956. 截断数组 - AcWing题库 不愧为acwing的中等题&#xff0c;细节是真的多&#xff0c;又又又阴沟翻船了。 题目要我们分成三个数组&#xff0c;求解又集几种分法。普遍思路是首先求解数组总和&#xff0c;除以3求的平均值。 第一个注意点&#xff1a;如果数组给的数的数…

PADS 改变图纸和图页边界大小

PADS 改变图纸和图页边界大小 有时候画一画原理图发现画布不够用了&#xff0c;可改变图纸大小&#xff0c;对应的改变图页边界 若图页边界怎么选择都改变不了&#xff0c;可将途中图页边界删除&#xff0c;重新加载 选择对应的图页边距就好啦 分类: PADS

重学Java 4 进制转换和位运算

天赋不好好使用的话&#xff0c;可是会被收回的哦 ——24.1.13 一、进制转换 1.常用的进制 2.十进制和二进制之间的转换 1.十进制转二进制 辗转相除法——循环除以2&#xff0c;取余数&#xff0c;除到商为0为止&#xff0c;除完后&#xff0c;由下往上&#xff0c;得出换算后…

一文搞懂,Python网络爬虫

网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。从功能上来讲&#xff0c;爬虫一般分为数据采集&…

虚拟主机 如何上传大于100M的文件 php网站程序

问题 虚拟主机上传文件大小限制100m&#xff0c; 有时会遇到非常大的文件上传&#xff0c;上传过程中耗时非常久&#xff0c; 可能服务器的限制设置了上传文件尺寸&#xff0c;返回“413 request entity too large” 整体逻辑 前端&#xff1a;上传文件时&#xff0c;进行文…

P1079 [NOIP2012 提高组] Vigenère 密码

一起来交流编程吧【CSDN app】&#xff1a; http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kx9pL9ccIHGKNLE0CWviAqQ_q6HzxomLW&authKeyVslKe623ptw8VRepda%2Bh0Ttr8Ruz8v%2FBW5HpVzyTWU7ECwpHIZpULMj6qIHYZBVb&noverify0&gro [NOIP2012 提高组] Vigenre 密码 题…

R语言【paleobioDB】——pbdb_collection():从PBDB获取单个采集号的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_collection (id, ...) Arguments 参数【…

C语言——内存函数【memcpy,memmove,memset,memcmp】

&#x1f4dd;前言&#xff1a; 在之前的文章C语言——字符函数和字符串函数&#xff08;一&#xff09;中我们学习过strcpy和strcat等用来实现字符串赋值和追加的函数&#xff0c;那么除了字符内容&#xff0c;其他的数据&#xff08;例如整型&#xff09;能否被复制或者移动呢…

【代码随想录】刷题笔记Day51

前言 周六刷题&#xff0c;闻所未闻吧兄弟&#xff0c;不用开组会简直太爽啦 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 子序列系列问题&#xff0c;用动态规划解决dp[i]含义 表示i之前包括i的以nums[i]结尾的最长递增子序列的长度递推公式 j从0到i-1各个…

揭示量化投资的神秘面纱:深入了解量化交易的核心原理!

随着科技的进步和大数据时代的到来&#xff0c;量化投资已成为金融市场的热门话题。但很多投资者对于量化投资的概念仍感神秘&#xff0c;不清楚其背后的原理和运作机制。本文将深入揭示量化投资的神秘面纱&#xff0c;帮助读者了解量化交易的核心原理。 量化投资的定义与起源 …

Docker 镜像

1、联合文件系统 UnionFS&#xff08;联合文件系统)&#xff1a;Union文件系统〈UnionFS)是一种分层、轻量级并且高性能的文件系统&#xff0c;它支持对文件系统的修改作为一次提交来一层层的叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文件系统下(unite several dir…

CCF认证+蓝桥杯习题训练

贪心 *上取整公式* *代码展示* #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 1e5 10;typedef long long LL;int v[N] , a[N];int main() {int n , d;cin >> n >> d;for(int i 1 ; i < n…

函数式编程 - 组合compose的使用方法

函数式编程中有一个比较重要的概念就是函数组合&#xff08;compose&#xff09;,组合多个函数&#xff0c;同时返回一个新的函数。调用时&#xff0c;组合函数按顺序从右向左执行。右边函数调用后&#xff0c;返回的结果&#xff0c;作为左边函数的参数传入&#xff0c;严格保…

Linux环境下使用flv.js + websokect播放RTSP视频流

本文适用于Linux系统部署Web项目&#xff0c;通过浏览器播放RTSP视频流 背景 ​ 在最近的项目中&#xff0c;涉及到海康威视接入的视频监控播放问题&#xff0c;海康这边可以获取到的视频流是rtsp格式&#xff0c;web端目前没有直接可以播放的组件&#xff0c;于是查阅众多博…

工业级安卓PDA超高频读写器手持掌上电脑,RFID电子标签读写器

掌上电脑&#xff0c;又称为PDA。工业级PDA的特点就是坚固&#xff0c;耐用&#xff0c;可以用在很多环境比较恶劣的地方。 随着技术的不断发展&#xff0c;加快了数字化发展趋势&#xff0c;RFID技术就是RFID射频识别及技术&#xff0c;作为一种新兴的非接触式的自动识别技术&…

python处理目录下文本文件去除空格和空行

一&#xff1a;实现思路&#xff1a; 要想实现去除某个目录下所有txt文件的空格&#xff0c;需要循环遍历一个目录下的所有文件&#xff0c; 获取文件的每行数据去除空格以后&#xff0c;重新保存数据到当前当前文件中。 处理空格,我们使用正则&#xff0c;这样可以去除字符串…

Java并查集设计以及路径压缩实现

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 并查集是一种树型的数据结构 &#xff0c;并查集可以高效地进行如下操作&#xff1a; 查询元素p和元素q是否属于同一组合并元素p和元素q所在的组 1、并查集的结构 并查集也是一种树型结构&#xff0c;但这棵树跟我们之…

C++面试八股--inline函数

1.inline 内联函数 1.1 特征 相当于把内联函数里面的内容写在调用内联函数处&#xff1b;相当于不用执行进入函数的步骤&#xff0c;直接执行函数体&#xff1b;相当于宏&#xff0c;却比宏多了类型检查&#xff0c;真正具有函数特性&#xff1b;编译器一般不内联包含循环、递归…