Использование std::iterator и std::unique_ptr с методами std::copy и std::memcpy

143
01 апреля 2018, 20:59

В функцию передаётся итератор и количество байт, которое необходимо скопировать в динамический массив к которому есть доступ через unique_ptr. Как мне правильно произвести вызов std::copy и std::memcpy в этом случае?

void Foo(std::iterator<std::input_iterator_tag, uint8_t> iter, int32_t length) {
    unique_ptr<char[]> container = make_unique<char[]>(100);
    std::copy (iter, iter + length, container); // Как скопировать содержимое iter в container
    std::memcpy (container, iter , length); // Как скопировать содержимое iter в container
    for (int i = 0; i < length; i++) cout << container[i];
};
Answer 1

Ответ для такого кода - никак.

Дело в том, что std::iterator - просто предоставляет псевдонимы iterator_category, value_type, difference_type, pointer, reference, причем обязательно передать только первые два параметра для определения iterator_category и value_type, остальные псевдонимы для типов будут сделаны на их основе, конечно, если Вам они подойдут. std::iterator не предоставляет никакого функционала, т.е. ни operator*, ни operator++, и т.д. у него нет, поэтому использовать его так, как Вы хотите не получится.

Его можно использовать, например, для реализации своего итератора:

class MyIterator: 
    public std::iterator<std::input_iterator_tag, MyType>
//Наследуемся от std::iterator с нужными аргументами,
//чтобы псевдонимы сами сгенерировались.

Стоит заметить, что std::iterator, начиная с C++17 является устаревшим.

READ ALSO
переносимость кода

переносимость кода

Для тот, чтоб задать свой вопрос, написал тривиальную структуру

182
Обработчик сигналов как член класса

Обработчик сигналов как член класса

Пишу класс работающий с трафиком RS485 портаПри открытии порта я указываю функцию, вызываемую при наличии во входном буфере порта каких-то...

144
error LNK2019: ссылка на неразрешенный внешний символ main в функции &ldquo;int __cdecl invoke_main(void)&rdquo; (?invoke_main@@YAHXZ)

error LNK2019: ссылка на неразрешенный внешний символ main в функции “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ)

Так как это должно быть приложение, то там должна быть функция int main(){}Возможно, ее роль выполняет функция go

265
Использование С/С++ в Python

Использование С/С++ в Python

Доброго времени, сутокМне надо надо написать функцию которую можно будет вызывать в Python 3

168