Здравствуйте, CiViLiS, Вы писали:
utils::copy_n<std::istream_iterator<char>&>(itr, 2, std::back_inserter(data_));
?
Сейчас наткнулся на проблему. Есть код
std::ifstream file(filename.c_str(), std::ios::binary);
std::istream_iterator<char> itr(file);
std::istream_iterator<char> itr_end;
char a = *itr;
utils::copy_n(itr, 2, std::back_inserter(data_)); // это полный аналог фнкции из расширения SGI http://www.sgi.com/tech/stl/copy_n.html
// template <class InputIterator, class Size, class OutputIterator>
// OutputIterator copy_n(InputIterator first, Size count, OutputIterator result);
char b = *itr;
После копирования итератор itr не измениться, так как он передается по значению в copy_n, поэтому а == b всегда. Получается что мы теряем третий байт в файле, так как если выполнить оператор ++ для итератора, то мы считаем уже четвертый байт.
Не дурак сказал я сам себе, вспоминая map.erase, и не долго думая написал
itr = utils::copy_n(itr, 2, std::back_inserter(data_));
на что ругнулся компилятор -- ибо функция copy_n возвращает итератор назначения, а не источника.
Я знаю как решить проблему поменяв декларация процедуры copy_n (передавать итератор-источник по ссылки или возвращать итератор-источник.). Но что делать если нельзя декларацию и хочется использовать copy_n?
PS Проблема немного упрощена, в реальном коде всё немного сложнее.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Здравствуйте, shank, Вы писали:
S>Здравствуйте, CiViLiS, Вы писали:
S>S>utils::copy_n<std::istream_iterator<char>&>(itr, 2, std::back_inserter(data_));
S>
S>?
Надо же, даже работает
... << RSDN@Home 1.2.0 alpha rev. 655>>
Здравствуйте, shank, Вы писали:
S>utils::copy_n<std::istream_iterator<char>&>(itr, 2, std::back_inserter(data_));
Еще boost::ref можно.