У меня есть 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
не подходит для этого?
конечно, в моем случае они типа IVector<IInspectable>
Оба одного типа?
да они оба одного типа
@IInspectable Я немного уточнил свой вопрос. Извините, я думал, что мой вопрос очевиден, но это не так.
Интерфейс ReplaceAll
, по-видимому, ориентирован на взаимодействие со стандартным C++. Шаблон класса array_view
действует как адаптер для стандартных контейнеров C++ (массивы, std::array
, std::vector
). Хотя array_view
может быть создан из пары итераторов, я не нашел способа создать совместимые типы итераторов из IVector
. begin(v)
и end(v)
возвращают экземпляры шаблона класса winrt::impl::fast_iterator
, которые несовместимы с конструктором array_view
. Если я что-то не упустил из виду, ReplaceAll
нельзя использовать с IVector
как есть.
Поскольку вы используете тип 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 со вторым контейнером.
Бен
Не могли бы вы рассказать больше о типе класса в
my_ivector1
иmy_ivector2
.