Как использовать метод ReplaceAll IVector для передачи данных из одного IVector в другой? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть 2 IVector s, и я хотел бы заменить все содержимое одного на содержимое другого.Метод 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 голосов
/ 26 апреля 2019

Поскольку вы используете тип C ++ WinRT, а не проецируемый вектор, в приведенном выше простом примере вы можете получить ссылку на базовый std :: vector с помощью get_container (). Вам нужно изменить типы переменных на auto вместо IVector <>. Оттуда вы можете перемещать или копировать элементы из одного вектора в другой, используя любую подходящую стандартную библиотечную технику. Простого присвоения значения должно быть достаточно для копирования содержимого. Э.Г.

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

Если вы пытаетесь работать с векторами WinRT, где они, как известно, не являются вашими реализациями C ++ / WinRT, то вам необходимо скопировать значения с использованием array_view.

Массив_вид и вектор не являются взаимозаменяемыми, так как кажется, что они должны быть. Они обеспечивают немного другую семантику и гарантии. Вам нужно будет использовать GetMany в первом контейнере, чтобы загрузить значения в нечто вроде std :: vector, размер которого изменен до размера контейнера, а затем вызвать ReplaceAll со вторым контейнером.

Ben

...