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);