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

У меня есть 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 не подходит для этого?

Не могли бы вы рассказать больше о типе класса в my_ivector1 и my_ivector2.

Nico Zhu - MSFT 11.04.2019 05:29

конечно, в моем случае они типа IVector<IInspectable>

mbl 11.04.2019 05:31

Оба одного типа?

Nico Zhu - MSFT 11.04.2019 07:13

да они оба одного типа

mbl 11.04.2019 07:13

@IInspectable Я немного уточнил свой вопрос. Извините, я думал, что мой вопрос очевиден, но это не так.

mbl 11.04.2019 19:24

Интерфейс ReplaceAll, по-видимому, ориентирован на взаимодействие со стандартным C++. Шаблон класса array_view действует как адаптер для стандартных контейнеров C++ (массивы, std::array, std::vector). Хотя array_view может быть создан из пары итераторов, я не нашел способа создать совместимые типы итераторов из IVector. begin(v) и end(v) возвращают экземпляры шаблона класса winrt::impl::fast_iterator, которые несовместимы с конструктором array_view. Если я что-то не упустил из виду, ReplaceAll нельзя использовать с IVector как есть.

IInspectable 12.04.2019 08:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
182
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Бен

Другие вопросы по теме