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

How to use the ReplaceAll method of IVector to transfer data from one IVector to another?

我有 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 不是正确的方法吗?

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

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

如果您尝试使用 WinRT 向量,但不知道它们是您的 C++/WinRT 实现,则您需要使用 array_view 复制这些值。

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