C++/WinRT 中的字符串处理

利用 C++/WinRT,你可以使用 C++ 标准库宽字符串类型(如 std::wstring)调用 Windows 运行时 API注:不要使用窄字符串类型,例如 std::string)。

C++/WinRT 确实有名为 winrt::hstring 的自定义字符串类型(在 C++/WinRT 基础库 %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h 中定义)。 这是 Windows 运行时构造函数、函数和属性实际上采用并返回的字符串类型。 但在很多情况下(由于 hstring 的转换构造函数和转换运算符),你可以选择是否要注意客户端代码中的 hstring。 如果你要创作 API,则很可能需要了解 hstring。

C++ 中有很多字符串类型。 除了 C++ 标准库中的 std::basic_string 之外,变体还存在于很多库中。 C++17 具有字符串转换实用程序和 std::basic_string_view,用来消除所有字符串类型之间的差别。 winrt::hstring 利用 std::wstring_view 提供了可转换性,以实现 std::basic_string_view 应有的互操作性。

将 std::wstring(也可以选择 winrt::hstring)与 Uri 结合使用

Windows::Foundation::Uri 从 winrt::hstring 构建。

public:Uri(winrt::hstring uri) const;

但 hstring 具有可让你使用它而无需注意它的转换构造函数。

下面是一个代码示例,展示了如何从宽字符串参数、从宽字符串视图和从 std::wstring 创建 Uri。

#include <winrt/Windows.Foundation.h>
#include <string_view>using namespace winrt;
using namespace Windows::Foundation;int main()
{using namespace std::literals;winrt::init_apartment();// You can make a Uri from a wide string literal.Uri contosoUri{ L"http://www.contoso.com" };// Or from a wide string view.Uri contosoSVUri{ L"http://www.contoso.com"sv };// Or from a std::wstring.std::wstring wideString{ L"http://www.adventure-works.com" };Uri awUri{ wideString };
}

属性访问器 Uri::Domain 属于类型 hstring。

public:winrt::hstring Domain();

但重复一下,由于 hstring 的 std::wstring_view 的转换运算符,注意该细节是一个可选操作。

// Access a property of type hstring, via a conversion operator to a standard type.
std::wstring domainWstring{ contosoUri.Domain() }; // L"contoso.com"
domainWstring = awUri.Domain(); // L"adventure-works.com"// Or, you can choose to keep the hstring unconverted.
hstring domainHstring{ contosoUri.Domain() }; // L"contoso.com"
domainHstring = awUri.Domain(); // L"adventure-works.com"

同样,IStringable::ToString 将返回 hstring。

public:hstring ToString() const;

Uri 将实现 IStringable 接口。

// Access hstring's IStringable::ToString, via a conversion operator to a standard type.
std::wstring tostringWstring{ contosoUri.ToString() }; // L"http://www.contoso.com/"
tostringWstring = awUri.ToString(); // L"http://www.adventure-works.com/"// Or you can choose to keep the hstring unconverted.
hstring tostringHstring{ contosoUri.ToString() }; // L"http://www.contoso.com/"
tostringHstring = awUri.ToString(); // L"http://www.adventure-works.com/"

你可以使用 hstring::c_str function 函数从 hstring 获取标准宽字符串(正如你可以从 std::wstring 获取一样)。

#include <iostream>
std::wcout << tostringHstring.c_str() << std::endl;

如果你有 hstring,则可以通过它创建 Uri。

Uri awUriFromHstring{ tostringHstring };

考虑一个采用 hstring 的方法。

public:Uri CombineUri(winrt::hstring relativeUri) const;

你刚刚看到的所有选项在这类情况下也适用。

std::wstring contact{ L"contact" };
contosoUri = contosoUri.CombineUri(contact);std::wcout << contosoUri.ToString().c_str() << std::endl;

hstring 具有成员 std::wstring_view 转换运算符,转换是免费实现的。

void legacy_print(std::wstring_view view);void Print(winrt::hstring const& hstring)
{legacy_print(hstring);
}

winrt::hstring 函数和运算符

为 winrt::hstring 实现了大量构造函数、运算符、函数和迭代程序。

hstring 是一个范围,因此你可以将其与基于范围的 for 或与 std::for_each 一起使用。 它还提供了一个比较运算符,用于自然、高效地与它在 C++ 标准库中的对应项进行比较。 它还包含将 hstring 用作关联容器的键所需的一切。

我们发现很多 C++ 库使用了 std::string,并且仅与 UTF-8 文本配合。 为方便起见,我们提供了 winrt::to_string、winrt::to_hstring 等用于来回转换的帮助程序。

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

winrt::hstring w{ L"Hello, World!" };std::string c = winrt::to_string(w);
WINRT_ASSERT(c == "Hello, World!");w = winrt::to_hstring(c);
WINRT_ASSERT(w == L"Hello, World!");

有关 hstring 函数和运算符的更多示例和信息,请参阅 winrt::hstring API 参考主题。

winrt::hstring 和 winrt::param::hstring 的原理

Windows 运行时根据 wchar_t 字符实现,但 Windows 运行时的应用程序二进制接口 (ABI) 不是 std::wstring 或 std::wstring_view 提供的内容的一部分。 使用这些将导致效率显著降低。 相反,C++/WinRT 提供了 winrt::hstring,它表示与基础 HSTRING 一致的不可变字符串,在与 std::wstring 的接口相似的接口后面实现。

你可能会注意到在逻辑上应该接受 winrt::hstring 的 C++/WinRT 输入参数实际上需要 winrt::param::hstring。 param 命名空间包含一组类型,专用于优化输入参数以自然地绑定到 C++ 标准库类型,以及避免副本和其他低效率现象。 你不应直接使用这些类型。 如果你要对自己的函数使用优化,则应使用 std::wstring_view。 另请参阅将参数传递到 ABI 边界。

这样,你便可以在很大程度上忽略 Windows 运行时字符串管理的细节,并使用你了解的资源高效地工作。 考虑到在 Windows 运行时中使用字符串的频率,这一点很重要。

设置字符串格式

用于字符串格式化的一个选择是 std::wostringstream。 下面是格式化和显示简单调试跟踪消息的示例。

#include <sstream>
#include <winrt/Windows.UI.Input.h>
#include <winrt/Windows.UI.Xaml.Input.h>
...
void MainPage::OnPointerPressed(winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e)
{winrt::Windows::Foundation::Point const point{ e.GetCurrentPoint(nullptr).Position() };std::wostringstream wostringstream;wostringstream << L"Pointer pressed at (" << point.X << L"," << point.Y << L")" << std::endl;::OutputDebugString(wostringstream.str().c_str());
}

设置属性的正确方式

可以将值传递给 setter 函数,以这种方式设置属性。 下面是一个示例。

// The right way to set the Text property.
myTextBlock.Text(L"Hello!");

以下代码不正确。 它可以编译,但只是修改 Text() 访问器函数返回的临时 winrt::hstring,然后就会将结果抛开。

// *Not* the right way to set the Text property.
myTextBlock.Text() = L"Hello!";

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

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

相关文章

js 常用基础 老写不出来的问题记录--持续更新

1、result返回一个数组 数组包含多个对象数组对象 要这个数组对象的其中两个属构成新的数组对象 这个时候就使用到了map函数 map可以映射原本数组中的每个元素 返回一个新的数组 result.map(item > { return { id:item.id, name:item.talentsName }})//定义新数组的每项数…

《每天一分钟学习C语言·十二》各种指针问题

1、 int arr; int * restrict pt &arr; *pt 100; *arr 10;注&#xff1a;restrict只能修饰指针&#xff0c;被restrict修饰的指针指向一块内存后这块内存就归这个指针管理了&#xff0c;其他任何指针都不能修改这块内存的内容&#xff0c;这是一个约定&#xff0c;当…

vue+js 实现将变量参数写至Cookie中,并进行读取,可以一次性写入多个值

vuejs 实现将变量参数写至cookie中&#xff0c;并进行读取&#xff0c;可以一次性写入多个值 【使用Vue和JavaScript将变量参数写入cookie并进行读取的示例代码】 <template><div><button click"writeToCookie">写入Cookie</button><but…

BGP安全特性详解(不看后悔!!!)

BGP安全特性 一、MD5认证 BGP认证只支持MD5认证&#xff0c;没有明文认证&#xff1b;BGP报文中没有设计认证字段&#xff0c;认证信息是存放到TCP报文中的option字段携带。 配置命令&#xff1a; peer x.x.x.x password cipher xxxx 二、GTSM GTSM&#xff0c;有效防止基…

微信公众号注册(详细图文教程)

目录 一、公众号注册准备1.1 准备事项1.2 个人注册1.3 企业注册 二、公众号注册2.1 基本信息填写2.2 选择类型2.3 信息登记2.4 公众号信息2.5 修改头像2.6 自动回复消息 三、总结 一、公众号注册准备 1.1 准备事项 公众号名称&#xff1a;公众号名称可以由中文、英文、数字、…

李宏毅LLM——ChatGPT原理剖析

文章目录 Chat-GPT引言关键技术——预训练研究问题玩文字冒险游戏 ChatGPT原理剖析 Chat-GPT引言 直观感受&#xff1a;结果有模有样、每次输出结果都不同、可以追问、幻想出的答案误解&#xff1a;罐头回答、答案是网络搜索的结果真正做的事&#xff1a;文字接龙&#xff0c;…

Spring Cloud中的提供者与消费者

在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务中&#xff0c;调用其它微服务的服务。&#xff08;调用…

Artipelag创意艺术展:在斯德哥尔摩的桥边,遇见莫奈!

近期&#xff0c;位于瑞典斯德哥尔摩的Artipelag 艺术博物馆策划了一场名为《想象莫奈》&#xff08;Imagine Monet&#xff09;的艺术展。 Artipelag除了通过传统的社交媒体来做宣传&#xff0c;还联合广告公司Sweet在线下策划了一次特别的宣传活动&#xff0c;以此来致敬这位…

openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c

文章目录 openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c概述笔记END openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c 概述 ED25519 签名/验签算法, 现在是最好的. 产生ED25519私钥/公钥 用私钥对明文签名, 得到签名数据 用公钥对明文…

CF1920 D. Array Repetition [细节规律题]

传送门:CF [前题提要]:一道*1800,本题思路很好想,就是找循环,但是细节较多,故写一篇题解 直接进入正题. 模拟一下题意,最后不难发现我们最后的字符串应该是一个字符串S1的循环加上一个S2的形式.(当然可能没有S2). 更具体的举一个小栗子,设 x , y , z , k x,y,z,k x,y,z,k为字…

Javascript——async、await详解

一、async、await是什么&#xff1f; async用于申明一个function是异步的&#xff1b; 而await则可以认为是 async await的简写形式&#xff0c;是等待一个异步方法执行完成的。**async函数** 通过在函数声明前加上async关键字&#xff0c;可以将任何函数转换为返回Promise的异…

nginx基本优化

安装nginx隐藏版本号 查看百度web服务器 [rootcjq11 ~]# curl -I http://www.baidu.com 隐藏nginx服务器版本号 [rootcjq11 ~]# cd /usr/local/src/nginx-1.22.0/ [rootcjq11 nginx-1.22.0]# vim src/core/nginx.h第13、14行修改版本号和服务器名称 [rootcjq11 nginx-1.2…

HAL库配置RS485通信

在配置好串口的基础上完成RS485的配置 一、使能RS485的发送和接收模式引脚 __HAL_RCC_GPIOG_CLK_ENABLE();//高电平是发送模式&#xff0c;低电平是接收模式&#xff0c;默认是接收模式HAL_GPIO_WritePin(PG4_RS485_DIR1_Port, PG4_RS485_DIR1_Pin, GPIO_PIN_RESET);GPIO_Init…

特征工程-特征处理(三)

特征处理 连续型变量处理&#xff08;二&#xff09; 多特征 降维 PCA PCA是一种常见的数据分析方式&#xff0c;通过数据分解&#xff0c;将高维数据降低为低维数据&#xff0c;同时最大程度保持数据中保存的信息。 from sklearn.decomposition import PCA A np.array([[84…

6、Pandas处理数据类型和缺失值

文章目录 简介数据类型缺失数据解决最常见的阻碍数据处理进展的问题 本节夸克网盘数据集链接:https://pan.quark.cn/s/07400ba46613 提取码:Z9sZ 简介 在本教程中,您将学习如何查看DataFrame或Series中的数据类型。您还将学习如何查找并替换数据。 数据类型 DataFrame或…

计算机毕业设计----SSH滑雪场场地租赁管理系统

项目介绍 该项目主要包括三个角色&#xff1a;管理员、收银员、用户&#xff1b; 用户角色包含以下功能&#xff1a; 用户登录,修改个人信息,查看我的订单等功能。 管理员角色包含以下功能&#xff1a; 管理员登录,滑雪场管理,订单管理,教练管理,器材管理,会员管理,收银员管…

【手撕C语言 第二集】初识C语言

​​ 一、变量的作用域和生命周期 作用域&#xff1a;一个变量在哪里可以使用它&#xff0c;哪里就是它的作用域。 局部变量的作用域&#xff1a;变量所在的局部范围 全局变量的作用域&#xff1a;整个工程 不管整个工程里面有多少源文件&#xff0c;都可以使用全局变量。这样…

WiFi7: ML建立流程

原文:ML (重)建立在non-AP MLD和AP MLD之间建立链接(link(s)),其基于(重)关联请求和(重)关联响应帧的简化完成。 NOTE-在以上流程之前,non-AP MLD和AP MLD必须进行认证流程。 原文:non-AP MLD可以发起 ML (重)建立,来建立一个或多个链接。Non-AP MLD必须发送(重)关联…

sqlilabs第五十七五十八关

Less-57(GET - challenge - Union- 14 queries allowed -Variation 4) 手工注入 Less-58(GET - challenge - Double Query- 5 queries allowed -Variation 1) 手工注入 报错注入就可以&#xff08;布尔注入的话次数不够&#xff09;(所以我们前面需要做够足够的数据支持) 最后…

关于 ant-design-vue resetFields 失效

关于 ant-design-vue resetFields 失效 背景&#xff1a; 遇到这样的问题使用ant-design-vue useForm来制作表单的时候&#xff0c;resetFields()失效 场景&#xff1a; 编辑 -赋值 新增-初始值&#xff08;问题点&#xff1a;新增的时候他就不初始化&#xff09; 方案&…