Исключения при работе с итераторами

379
18 февраля 2017, 06:22

Решаю следующую задачу: есть некоторый файл, структура которого представляет собой набор блоков. Каждый блок имеет заголовок и тело. Последний блок отмечен соответствующим идентификатором. Для обхода блоков в файле пишу собственный итератор:

/**
 * @brief Single-pass input iterator.
 */
class BlockIterator : public std::iterator<std::input_iterator_tag, const DataBlock> {
  private:
    friend class FileReader;
    FileReader* reader;
    // Текущий блок, на который указывает итератор.
    std::unique_ptr<DataBlock> block;
    BlockIterator(FileReader* r, std::unique_ptr<DataBlock> b) noexcept : reader(r), block(std::move(b)) {
        /*NOP*/
    };
  public:
    BlockIterator& operator++() {
        auto nextBlockOffset = block->offset + block->headerSize + block->bodySize;
        block = reader->getBlockAt(nextBlockOffset);
        //              ^^^ Функция может выкидывать исключение!
        return *this;
    }
    BlockIterator operator++(int) {
        auto retval = *this;
        ++(*this);
        return retval;
    }
    bool operator==(const BlockIterator& other) const {
        return reader == other.reader && block == other.block;
    }
    bool operator!=(const BlockIterator& other) const {
        return !(*this == other);
    }
    reference operator*() const {
        return *block;
    }
};

При инкременте функция getBlockAt() может выкидывать исключение (например, если парсим невалидный файл). Как в этом случае лучше поступать: необходимо ли гарантировать отсутствие исключений при работе с итератором? Если да, то как обеспечить инвалидацию итератора и вывод ошибки?

READ ALSO
VIPS library Qt

VIPS library Qt

Пытаюсь собрать проект с VIPS LibПодключил следующие

324
Обработка изображения с помощью OpenCV

Обработка изображения с помощью OpenCV

Стоит задача распознавания капчи с некоторого ресурса

396
MPI -обновление флага

MPI -обновление флага

Изучаю MPI, появился вопрос:

328
sort не работает с std::bind

sort не работает с std::bind

Почему код не работает, если вместо 3 вставить число меньше 6И как это можно исправить? Код должен сортировать вектор с помощью функтора std::greater,...

360