标准 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#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++