У меня есть массив данных в массиве C++/CLI, который я могу передать в собственную функцию, используя pin_ptr<T>
, пока без проблем. Однако теперь мне нужно передать массив функции C++/STL, которая ожидает контейнер, такой как std::array
или std::vector
.
Самый простой способ сделать это (который я сделал первым) — скопировать элемент за элементом.
Второй самый простой способ — вызвать std::copy()
, см. ответ на этот вопрос: convert System::array to std ::вектор.
Однако я хочу пропустить весь шаг копирования и вместо этого просто использовать указатель. Поскольку std::array
требует аргумента шаблона для определения его длины, я не могу создать его во время выполнения (но, пожалуйста, поправьте меня, если я ошибаюсь). Есть ли способ создать вектор или другой тип контейнера STL без ненужного копирования данных?
ref class
, которые нужно преобразовать? Любой из этих случаев также исключает передачу указателей. - person crashmstr   schedule 11.11.2015span
, что должно позволить обернутьSystem::array
. - person doug   schedule 30.06.2020unique_ptr
илиshared_ptr
, которые могут владеть/ссылаться на динамические массивы. Тот факт, что они поставляются с собственной семантикой, означает, что они не будут работать во всех ситуациях, как и тот факт, что они не несут с собой размер, но они могут работать в некоторых ситуациях. Они, конечно, избегают копирования, так как они просто получают право собственности/ссылку на существующий указатель. Я не знаю, насколько часто они практически полезны/рекомендуются, но я упоминаю для завершения. - person underscore_d   schedule 01.07.2020std::span
недоступен в С++ 17, и это последняя версия С++, которая поддерживает С++/cli. Но его можно поместить в отдельный файл, скомпилированный с последними и совместимыми ABI. Похоже, что С++ 17 может стать концом пути для С++/cli. - person doug   schedule 05.07.2020