winrt::com_array结构模板(C++/WinRT)

表示通过 COM 任务分配器分配和释放基础缓冲区的数据的 C 样式一致性数组,因此该数组的名称。 它通常用于表示由一个组件分配的 C 样式一致性数组,并由另一个组件释放。

winrt::com_array 用于向/从 Windows 运行时 API 传递参数。 如果要创作 API,则可能需要构造一个 winrt::com_array,以便将投影数组返回到调用方;作为返回值或通过输出参数。

winrt::com_array 派生自 winrt::array_view。 请参阅 winrt::array_view 结构模板主题,其中记录了可用于 winrt::com_array的成员和免费运算符。 但是,请注意基类型 winrt::array_view(这是连续一系列值的非拥有视图或范围)和 winrt::com_array(分配和释放其自己的元素)之间的语义差异。

语法

template <typename T>
struct com_array : winrt::array_view<T>

模板参数

typename T com_array 包含的值(元素)的类型。

要求

受支持的最低 SDK: Windows SDK 版本 10.0.17134.0 (Windows 10 版本 1803)

Namespace: winrt

标头: %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h (默认包含)

构造 函数

构造 函数 描述
com_array::com_array构造函数 使用输入数据的副本初始化 com_array 结构的新实例,如果未提供任何数据,则使用默认值 T

成员函数

功能 描述
com_array::clear 函数 使 com_array 对象为空。

成员运算符

算子 描述
com_array::operator= (赋值运算符) 将值分配给 com_array 对象。

免费函数

功能 描述
detach_abi 函数 com_array 对象从其原始值中分离,可能将其返回到调用方。 清除 com_array。 另请参阅 winrt::d etach_abi 函数
put_abi 函数 检索 com_array 的地址,以便将其设置为另一个值。 另请参阅 winrt::p ut_abi 函数
交换函数 交换两个 com_array 参数的内容。

com_array::com_array 构造函数

使用输入数据的副本初始化 com_array 结构的新实例,如果未提供任何数据,则使用默认值 T

语法

构造函数已编号,并在下面的 备注 中进一步描述。

1.  com_array() noexcept;
2.  com_array(uint32_t const count);
3.  com_array(uint32_t const count, T const& value);
4.  template <typename InIt> com_array(InIt first, InIt last);
5.  com_array(std::vector<T> const& vectorValue);
6.  template <size_t N> com_array(std::array<T, N> const& arrayValue);
7.  template <uint32_t N> com_array(T const(&rawArrayValue)[N])
8.  com_array(std::initializer_list<T> initializerListValue);
9.  com_array(void* ptr, uint32_t const count, winrt::take_ownership_from_abi_t) noexcept;
10. com_array(com_array&& comArrayValue) noexcept;

模板参数

typename InIt 提供输入数据的输入迭代器。

size_t N uint32_t N 输入数据中的值数(元素)。

参数

arrayValue 初始化 com_array 对象的 std::array 值。

comArrayValue 另一个初始化 com_array 对象的 com_array。 构造函数返回后,comArrayValue 将为空。

count com_array 对象的元素计数。

first last 一对输入迭代器。 范围中的值 [第一最后一)用于初始化 com_array 对象。

initializerListValue 初始化 com_array 对象的初始值设定项列表值。

ptr 指向 N 值的块的指针,通过使用 CoTaskMemAlloc分配的值块。 com_array 对象获取此内存的所有权。

rawArrayValue 初始化 com_array 对象的 C 样式数组。

value 要提供给 com_array 对象的每个元素的值。

vectorValue 初始化 com_array 对象的 std::vector 值。

言论

构造函数以上述语法 编号。

1. 默认构造函数

构造空缓冲区。

2. 容量构造函数;默认值

创建一个 计数 元素的缓冲区,所有这些是默认构造 T的副本。

这类似于创建 计数 元素的缓冲区,每个缓冲区都是默认构造 T

auto players{ winrt::com_array<MediaPlayer>(50) };

MediaPlayer 对象的默认构造函数创建对新媒体播放器对象的引用,其复制构造函数复制引用。 因此,上述代码行创建对同一媒体播放器对象的 50 个引用的数组。 它不会创建 50 个不同的媒体播放器对象的数组。

3. 容量构造函数;显式值

创建一个 计数 元素的缓冲区,每个元素都是所提供的 值的副本

winrt::com_array(2, 42) 被解释为尝试使用范围构造函数 (4)。 但它失败,因为 2 和 42 不是迭代器。 若要将此函数解释为具有显式 int32_t 值的容量构造函数,请使用显式无符号整数作为第一个参数:com_array(2u, 42)

4. 范围构造函数

创建一个缓冲区,该缓冲区是区域的副本 [第一个最后一个)。

显式声明基础类型 T,如下所示。

auto a{ winrt::com_array<T>(source.begin(), source.end()) };

若要移动区域,而不是复制范围,请使用 std::move_iterator迭代器适配器。

auto a{ winrt::com_array<T>(std::move_iterator(source.begin()),
                            std::move_iterator(source.end())) };

5. 矢量构造函数

创建一个缓冲区,该缓冲区是 vectorValue的内容的副本。

6. 数组构造函数

创建一个缓冲区,该缓冲区是 arrayValue的内容的副本。

7. C 样式数组构造函数

创建一个缓冲区,该缓冲区是 rawArrayValueC 样式数组的内容的副本。

8. Initializer-list 构造函数

创建一个缓冲区,该缓冲区是初始值设定项列表 initializerListValue的内容的副本。

9. ABI 构造函数

获取指定长度的缓冲区的所有权。

此最低级别的构造函数。 如果已通过 CoTaskMemAlloc分配内存块,并且希望 com_array 承担其责任,请使用它。 若要强调此构造函数的特殊要求,最终参数必须 winrt::take_ownership_from_abi

10. 移动构造函数

将资源从同一类型的另一个 com_array 移动,使原始资源为空。

构造函数 5、6 和 7

复制所提供容器的内容。 可以将范围构造函数 (4) 与 std::move_iterator 迭代器适配器配合使用,将内容移动到 com_array 而不是复制它们。

com_array::clear 函数

使 com_array 对象为空。

语法

void clear() noexcept;

detach_abi函数

com_array 对象从其原始值中分离,可能将其返回到调用方。 清除 com_array。 另请参阅 winrt::d etach_abi 函数

语法

auto detach_abi(winrt::com_array<T>& object) noexcept;
auto detach_abi(winrt::com_array<T>&& object) noexcept;

参数

object 要操作的 com_array 对象。

返回值

一个包含元素计数的双元素元组,以及 com_array 跨越的连续一系列值。

com_array::operator= (赋值运算符)

将值分配给 com_array 对象。

语法

com_array& operator=(winrt::com_array&& comArrayValue) noexcept;

参数

comArrayValue 要分配给 com_array 对象的 com_array 值。

返回值

com_array 对象的引用。

put_abi 函数

检索 com_array 的地址,以便将其设置为另一个值。 另请参阅 winrt::p ut_abi 函数

语法

template<typename T> auto put_abi(winrt::com_array<T>& object) noexcept;

参数

object 要操作的 com_array 对象。

返回值

com_array的地址,可以设置为另一个值。

swap 函数

交换两个 com_array 参数的内容。

语法

friend void swap(winrt::com_array& left, winrt::com_array& right) noexcept;

参数

left right 一个 com_array 值,其内容与其他参数的内容相互交换。

using namespace winrt;
...
    com_array<byte> left{ 1,2,3 };
    com_array<byte> right{ 4,5,6 };
    swap(left, right);

另请参阅