如何使用IVector的ReplaceAll方法将数据从一个IVector传输到另一个?

时间:2019-04-10 11:31:24

标签: uwp c++-winrt

我有2个IVector,我想用一个的所有内容替换另一个的内容。 ReplaceAll方法似乎可行。

所以我尝试了以下操作:

IVector<IInspectable> my_ivector1 = winrt::single_threaded_vector<IInspectable>({ box_value(L"whatever1") });
IVector<IInspectable> my_ivector2 = winrt::single_threaded_vector<IInspectable>({ box_value(L"whatever2") });
std::array<const IInspectable, 1> arrv{ box_value(L"result") };

my_ivector2.ReplaceAll(arrv);
auto res = unbox_value<hstring>(my_ivector2.GetAt(0)); // This works, res == L"result". The content of my_ivector2 was replaced by the content of arrv. 

my_ivector2.ReplaceAll(my_ivector1); // compilation error

编译错误:

cannot convert argument 1 from 'winrt::Windows::Foundation::Collections::IVector<winrt::Windows::Foundation::IInspectable>' to 'winrt::array_view<const winrt::Windows::Foundation::IInspectable>'

我希望能够使用ReplaceAll用另一个IVector的内容替换一个IVector的所有内容。 ReplaceAll是执行此操作的正确方法吗?

1 个答案:

答案 0 :(得分:0)

由于您使用的是C ++ WinRT类型,而不是投影的矢量,因此在上面的简单示例中,您可以使用get_container()获得对底层std :: vector的引用。您需要将变量类型更改为auto而不是IVector <>。从那里,您可以根据需要使用任何标准库技术将元素从一个矢量移动或复制到另一矢量。简单的值分配应足以复制内容。例如

my_ivector2.get_container()= my_ivector1.get_container();

如果您要使用WinRT向量,而其中的C ++ / WinRT实现并不为人所知,则需要使用array_view复制这些值。

array_view和vector不能互换,尽管看起来应该互换。它们提供了稍微不同的语义和保证。您需要在第一个容器上使用GetMany将值加载到调整为容器大小的std :: vector之类的东西中,然后在第二个容器中调用ReplaceAll。