Алгоритм AFAIK std::copy ничего не проверяет, а просто перебирает все элементы и копирует их в выходной итератор. Это означает, что вы должны самостоятельно предоставить достаточно места в выходном итераторе, иначе поведение не указано.
Поэтому в вашем случае вы должны сами проверить, что выходной файл доступен для записи и т. д. Один из возможных способов проверить это, я думаю, использовать флаги ошибок для используемого вами файлового потока, т.е. после копирования проверьте, что ваш ofstream
является good
(вы для этого можно использовать функции good()
, eof()
, fail()
и bad()
).
Второй подход заключается в проверке возвращаемого значения std::copy
. Поскольку он возвращает итератор в конец диапазона назначения (который указывает на элемент, следующий за копией последнего), вы можете вычислить разницу между возвращаемым значением std::copy
и вашим выходным итератором и убедиться, что он равен размеру ваш deque
. Например. (псевдокод)
OutputIterator result = std::copy(input.begin(), input.end(), output);
assert(result - output == input.end() - input.begin());
EDIT: Второй подход работает только тогда, когда output
также является типом итератора ввода, поэтому std::distance
работает для него. Правильнее будет написать:
assert(std::distance(output, result) == std::distance(input.begin(), input.end()));
person
Artak Begnazaryan
schedule
13.03.2012