标准 C++ 数据类型和 C++/WinRT

2024-01-13 22:28
文章标签 c++ 数据类型 标准 winrt

本文主要是介绍标准 C++ 数据类型和 C++/WinRT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

借助 C++/WinRT,可以使用标准 C++ 数据类型(包括某些 C++ 标准库数据类型)调用 Windows 运行时 API。 可以将标准字符串传递到 API(请参阅 C++/WinRT 中的字符串处理),还可以将初始值列表和标准容器传递到 API,这些 API 需要语义上等价的集合。

标准初始值列表

初始值列表 (std::initializer_list) 是 C++ 标准库构造。 调用特定的 Windows 运行时构造函数和方法时,可以使用初始值列表。 例如,可以使用初始值列表来调用 DataWriter::WriteBytes。

#include <winrt/Windows.Storage.Streams.h>using namespace winrt::Windows::Storage::Streams;int main()
{winrt::init_apartment();InMemoryRandomAccessStream stream;DataWriter dataWriter{stream};dataWriter.WriteBytes({ 99, 98, 97 }); // the initializer list is converted to a winrt::array_view before being passed to WriteBytes.
}

此工作分为两个部分。 第一,DataWriter::WriteBytes 方法选取一个 winrt::array_view 类型的参数。

void WriteBytes(winrt::array_view<uint8_t const> value) const

winrt::array_view 是用于安全地表示一系列连续值的自定义 C++/WinRT 类型(它在 C++/WinRT 基础库 %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h 中定义)。

第二,winrt::array_view 有一个初始值列表构造函数。

template <typename T> winrt::array_view(std::initializer_list<T> value) noexcept

在很多情况下,可以选择是否要注意编程中的 winrt::array_view。 如果你选择不注意它,那么在等效类型出现在 C++ 标准库中时不用更改任何代码。

可以将初始值列表传递给需要集合参数的 Windows 运行时 API。 以 StorageItemContentProperties::RetrievePropertiesAsync 为例。

IAsyncOperation<IMap<winrt::hstring, IInspectable>> StorageItemContentProperties::RetrievePropertiesAsync(IIterable<winrt::hstring> propertiesToRetrieve) const;

可以使用类似如下的初始值列表调用该 API。

IAsyncAction retrieve_properties_async(StorageFile const storageFile)
{auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync({ L"System.ItemUrl" }) };
}

在这里,两个因子正在起作用。 第一个,被调用方从初始值列表构建 std::vector(此被调用方是异步的,因此能够拥有该对象,而这是必需的)。 第二个,C++/WinRT 透明地(并且不会引入副本)将 std::vector 作为 Windows 运行时集合参数绑定。

标准数组和矢量

winrt::array_view 还有来自 std::vector 和 std::array 的转换构造函数。

template <typename C, size_type N> winrt::array_view(std::array<C, N>& value) noexcept
template <typename C> winrt::array_view(std::vector<C>& vectorValue) noexcept

因此,可以改为使用 std::vector 调用 DataWriter::WriteBytes。

std::vector<byte> theVector{ 99, 98, 97 };
dataWriter.WriteBytes(theVector); // theVector is converted to a winrt::array_view before being passed to WriteBytes.

或使用 std::array。

std::array<byte, 3> theArray{ 99, 98, 97 };
dataWriter.WriteBytes(theArray); // theArray is converted to a winrt::array_view before being passed to WriteBytes.

C++/WinRT 将 std::vector 作为 Windows 运行时集合参数绑定。 因此,可以传递一个 std::vector<winrt::hstring>,它将转换为 winrt::hstring 的合适 Windows 运行时集合。 如果被调用方是异步的,则需要记住一个额外细节。 由于这种情况的实现细节,需要提供右值,因此必须提供矢量的副本或动作。

在以下代码示例中,我们将矢量的所有权移动到异步的被调用方所接受的参数类型的对象(然后在移动之后务必不再访问 vecH)。 如果想要了解有关右值的详细信息,请参阅值类别以及对它们的引用。

IAsyncAction retrieve_properties_async(StorageFile const storageFile, std::vector<winrt::hstring> vecH)
{auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync(std::move(vecH)) };
}

但你无法传递需要 Windows 运行时集合的 std::vector<std::wstring>。 原因在于,由于已经转换为 std::wstring 的合适 Windows 运行时集合,C++ 语言随后不会强制转换该集合的类型参数。 因此,将不会编译以下代码示例(解决方案将改为传递 std:: vector<winrt::hstring>,如上所示)。

IAsyncAction retrieve_properties_async(StorageFile const storageFile, std::vector<std::wstring> vecW)
{auto properties{ co_await storageFile.Properties().RetrievePropertiesAsync(std::move(vecW)) }; // error! Can't convert from vector of wstring to async_iterable of hstring.
}

原始数组和指针范围

请记住,C++ 标准库中将来可能存在等效类型,如果你选择或需要直接使用 winrt::array_view,则还可以这样做。

winrt::array_view 具有来自原始数组和来自一系列 T*(指向元素类型的指针)的转换构造函数。

using namespace winrt;
...
byte theRawArray[]{ 99, 98, 97 };
array_view<byte const> fromRawArray{ theRawArray };//array_view<T>
dataWriter.WriteBytes(fromRawArray); // the winrt::array_view is passed to WriteBytes.array_view<byte const> fromRange{ theArray.data(), theArray.data() + 2 }; // just the first two elements.
dataWriter.WriteBytes(fromRange); // the winrt::array_view is passed to WriteBytes.

winrt::array_view 函数和运算符

为 winrt::array_view 实现了大量构造函数、运算符、函数和迭代程序。 winrt::array_view 是一个范围,因此可以将其与基于范围的 for 或与 std::for_each 一起使用

有关更多示例和信息,请参阅 winrt::array_view API 参考主题。

IVector<T> 和标准迭代构造

SyndicationFeed.Items 是 Windows 运行时 API,它返回类型 IVector<T> 的集合(作为 winrt::Windows::Foundation::Collections::IVector<T> 投影到 C++/WinRT)。 可以将此类型与基于范围的 for 等标准迭代结构一起使用。

// main.cpp
#include "pch.h"
#include <winrt/Windows.Web.Syndication.h>
#include <iostream>using namespace winrt;
using namespace Windows::Web::Syndication;void PrintFeed(SyndicationFeed const& syndicationFeed)
{for (SyndicationItem const& syndicationItem : syndicationFeed.Items()){std::wcout << syndicationItem.Title().Text().c_str() << std::endl;}
}

具有异步 Windows 运行时 API 的 C++ 协同程序

调用异步 Windows 运行时 API 时,可以继续使用并行模式库 (PPL)。 但在许多情况下,C++ 协同程序为与异步对象进行交互提供了一种高效且易于编码的习惯用法。 详细信息和代码示例,请参阅利用 C++/WinRT 实现的并发和异步运算。

这篇关于标准 C++ 数据类型和 C++/WinRT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/602993

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3