65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (5投票s)

2014年5月4日

CPOL

2分钟阅读

viewsIcon

21331

downloadIcon

275

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
} 

使用自动转换为 IVectorVector 类同样简单,但仅支持原生 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
© . All rights reserved.