Поделиться через


шаблон структуры winrt::com_array (C++/WinRT)

Представляет соответствующий массив данных в стиле C, где базовый буфер выделяется и освобождается с помощью средства выделения задач COM, следовательно, имя. Обычно он используется для представления соответствующего массива стилей C, который выделяется одним компонентом и освобождается другим.

winrt::com_array используется для передачи параметров в API среды выполнения Windows и из него. Если вы создаете API-интерфейсы, вам, вероятно, потребуется создать winrt::com_array, чтобы вернуть проецируемый массив вызывающей программе; либо в качестве возвращаемого значения, либо через выходной параметр.

winrt::com_array является производным от winrt::array_view. См. раздел шаблона шаблона структуры winrt::array_view, в котором также доступны члены и бесплатные операторы, доступные для winrt::com_array. Тем не менее следует учитывать разницу в семантике между базовым типом winrt::array_view (которое представляет собой представление, отличное от владения, или диапазон, непрерывного ряда значений), и winrt::com_array (который выделяет и освобождает свои собственные элементы).

Синтаксис

template <typename T>
struct com_array : winrt::array_view<T>

Параметры шаблона

typename T Тип значений (элементов), содержащихся в com_array.

Требования

минимальный поддерживаемый пакет SDK: windows SDK версии 10.0.17134.0 (Windows 10 версии 1803)

пространство имен : winrt

заголовок : %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h (включен по умолчанию)

Конструкторы

Конструктор Описание
конструктор com_array::com_array Инициализирует новый экземпляр структуры com_array с копией входных данных или значениями по умолчанию T если данные не предоставлены.

Функции-члены

Функция Описание
com_array::clear function Делает объект com_array пустым.

Операторы-члены

Оператор Описание
com_array::operator= (оператор назначения) Назначает значение объекту com_array.

Бесплатные функции

Функция Описание
detach_abi функции Отсоединяет объект com_array от необработанных значений, возможно, чтобы вернуть их вызывающему объекту. com_array очищается. См. также функцию winrt::d etach_abi.
функции put_abi Извлекает адрес com_array, чтобы его можно было задать для другого значения. См. также функцию winrt::p ut_abi.
функции замены Переключает содержимое двух параметров com_array.

конструктор com_array::com_array

Инициализирует новый экземпляр структуры com_array с копией входных данных или значениями по умолчанию T если данные не предоставлены.

Синтаксис

Конструкторы нумеруются и описаны далее в примечаниях ниже.

1.  com_array() noexcept;
2.  com_array(uint32_t const count);
3.  com_array(uint32_t const count, T const& value);
4.  template <typename InIt> com_array(InIt first, InIt last);
5.  com_array(std::vector<T> const& vectorValue);
6.  template <size_t N> com_array(std::array<T, N> const& arrayValue);
7.  template <uint32_t N> com_array(T const(&rawArrayValue)[N])
8.  com_array(std::initializer_list<T> initializerListValue);
9.  com_array(void* ptr, uint32_t const count, winrt::take_ownership_from_abi_t) noexcept;
10. com_array(com_array&& comArrayValue) noexcept;

Параметры шаблона

typename InIt итератор ввода, предоставляющий входные данные.

size_t N uint32_t N Число значений (элементов) в входных данных.

Параметры

arrayValue значение std::array, которое инициализирует объект com_array.

comArrayValue другой com_array, который инициализирует объект com_array. После возврата конструктора comArrayValue будет пустым.

count Число элементов объекта com_array.

first last пару входных итераторов. Значения в диапазоне [первый, последний) используются для инициализации объекта com_array.

initializerListValue значение списка инициализатора, которое инициализирует объект com_array.

ptr Указатель на блок значений N, выделенный с помощью CoTaskMemAlloc. Объект com_array владеет этой памятью.

rawArrayValue массив стилей C, который инициализирует объект com_array.

value Значение для каждого элемента объекта com_array.

vectorValue значение std::vector, которое инициализирует объект com_array.

Замечания

Конструкторы нумеруются в синтаксисе выше.

1. Конструктор по умолчанию

Создает пустой буфер.

2. Конструктор емкости; значение по умолчанию

Создает буфер счетчика элементов, все из которых являются копиями по умолчанию.

Это похоже на создание буфера подсчета элементов, каждое из которых является Tпо умолчанию.

auto players{ winrt::com_array<MediaPlayer>(50) };

Конструктор по умолчанию MediaPlayer создает ссылку на новый объект проигрывателя мультимедиа, а его конструктор копирования копирует ссылку. Таким образом, указанная выше строка кода создает массив из 50 ссылок на тот же объект проигрывателя мультимедиа. Он не создает массив из 50 различных объектов проигрывателя мультимедиа.

3. Конструктор емкости; явное значение

Создает буфер счетчика элементов, каждый из которых является копией предоставленного значения .

winrt::com_array(2, 42) интерпретируется как попытка использовать конструктор диапазона (4). Но это не так, потому что 2 и 42 не являются итераторами. Чтобы получить его интерпретировать как конструктор емкости с явным значением int32_t, используйте явное целое число без знака в качестве первого параметра: com_array(2u, 42).

4. Конструктор диапазона

Создает буфер, который является копией диапазона [первый, последний).

Укажите базовый тип T явно, как показано ниже.

auto a{ winrt::com_array<T>(source.begin(), source.end()) };

Чтобы переместить диапазон, а не копировать его, используйте адаптер итератора std::move_iterator.

auto a{ winrt::com_array<T>(std::move_iterator(source.begin()),
                            std::move_iterator(source.end())) };

5. Конструктор векторов

Создает буфер, который является копией содержимого vectorValue.

6. Конструктор массива

Создает буфер, который является копией содержимого массива массива .

7. Конструктор массива в стиле C

Создает буфер, который является копией содержимого массива стилей C rawArrayValue.

8. Конструктор initializer-list

Создает буфер, который является копией содержимого списка инициализатора initializerListValue.

9. Конструктор ABI

Берет на себя владение буфером указанной длины.

Этот самый низкий уровень конструкторов. Используйте его, если у вас уже выделен блок памяти через CoTaskMemAlloc, и вы хотите, чтобы com_array взять на себя ответственность за него. Чтобы подчеркнуть особые требования для этого конструктора, окончательный аргумент должен быть winrt::take_ownership_from_abi.

10. Конструктор перемещения

Перемещает ресурсы из другого com_array одного типа, оставляя исходное пустое.

Конструкторы 5, 6 и 7

Копируются содержимое предоставленного контейнера. Конструктор диапазона (4) можно использовать с std:::move_iterator итератором для перемещения содержимого в com_array вместо копирования.

функция com_array::clear

Делает объект com_array пустым.

Синтаксис

void clear() noexcept;

функция detach_abi

Отсоединяет объект com_array от необработанных значений, возможно, чтобы вернуть их вызывающему объекту. com_array очищается. См. также функцию winrt::d etach_abi.

Синтаксис

auto detach_abi(winrt::com_array<T>& object) noexcept;
auto detach_abi(winrt::com_array<T>&& object) noexcept;

Параметры

object объект com_array для работы.

Возвращаемое значение

Кортеж двух элементов, содержащий число элементов, и смежный ряд значений, охватываемых com_array.

com_array::operator= (оператор назначения)

Назначает значение объекту com_array.

Синтаксис

com_array& operator=(winrt::com_array&& comArrayValue) noexcept;

Параметры

comArrayValue значение com_array для назначения объекту com_array.

Возвращаемое значение

Ссылка на объект com_array.

функция put_abi

Извлекает адрес com_array, чтобы его можно было задать для другого значения. См. также функцию winrt::p ut_abi.

Синтаксис

template<typename T> auto put_abi(winrt::com_array<T>& object) noexcept;

Параметры

object объект com_array для работы.

Возвращаемое значение

Адрес com_array, готовый к присвоению другого значения.

Функция переключения

Переключает содержимое двух параметров com_array.

Синтаксис

friend void swap(winrt::com_array& left, winrt::com_array& right) noexcept;

Параметры

left right значение com_array, содержимое которого необходимо взаимонаключать с другими параметрами.

Пример

using namespace winrt;
...
    com_array<byte> left{ 1,2,3 };
    com_array<byte> right{ 4,5,6 };
    swap(left, right);

См. также

  • пространства имен winrt