WRL 集合库移植到原生 C++






4.60/5 (5投票s)
WRL 集合库移植到原生 C++
引言
微软在 collection.h 中包含了集合包装器的整个源代码,但他们仅在条件编译中提供 WRL 包装器以支持 C++/CX。 如果你想将现有的 STL vector
包装到实现 WRL 接口的对象中,或者将 WRL 向量包装到 STL vector
中,那么你需要自己编写库或像我一样移植微软的代码。 这可以通过将所有 C++/CX 代码转换为 C++ 来完成。
背景
应该熟悉 C++、IDL、基本的 WRL、Windows Runtime 和 C++/CX,才能管理整个原生 C++ 项目,并了解主要节省在于不必链接 C++/CX 平台包装库所带来的显著开销。
Using the Code
可能需要添加 IDL 以提供自定义模板特化,并确保包含生成的头文件,你将在其中使用特化。
declare
{
interface Windows.Foundation.Collections.IVector<int>;
}
使用方式与 C++/CX 相同,只是添加了 ABI
命名空间,以及将 Platform
命名空间对象(例如 Platform::Object^
到 IInspectable*
或 Platform::String^
到 HSTRING
)的常规移植。 例如,使用隐藏的 VectorIterator
就像获取 WRL 返回的 IVector
并执行范围枚举一样简单,因为 begin 和 end 函数已经定义为利用它。
ABI::Windows::Foundation::Collections::IVector<IInspectable*> vector;
for (auto item : vector) { // process item
}
使用自动转换为 IVector
的 Vector
类同样简单,但仅支持原生 WinRT 类型。
Collections_winrt::Vector<HSTRING> vector;
vector.Append(Microsoft::WRL::Wrappers::HStringReference(L"Example").Get();
关注点
虽然这次移植相对简单,但应谨慎使用,因为使用 WRL 对象的开销大于原生 STL 对象。 仅在与 WRL 代码或对象交互时才使用这些实用程序。 微软还提供了对可绑定接口的支持,虽然可以禁用,但也需要一系列包装类来避免多重继承冲突。
Agile
包装器被转换为 WRL,以提供适当的兼容性,用于此库。
此处的库包含在 Collections_winrt
命名空间中,而不是 Platform::Collection
。
此移植支持 Visual Studio 2012/2013/2015/2017 和 Windows 8/8.1/10.0.10240.0-10.0.16299.0,在一个库中,并且版本之间的更改相对较少,主要是在构造函数中添加了一些 map 类和新的 STL initializer_list
的使用。
历史
- 2014 年 5 月 3 日:初始版本
- 2017 年 12 月 9 日:更新为 VS2017