интерфейс итератора обработки исключений - PullRequest
2 голосов
/ 01 октября 2011

Я пытаюсь создать водонепроницаемый интерфейс для библиотеки, которую я проектирую. Пользователь должен ввести двумерные данные, и поэтому я подумал, что интерфейс итератора, подобный std::transform, будет прозрачным. Тем не менее, я не уверен, как исключение обрабатывать любые злоупотребления итераторами.

Мой интерфейс такой (я могу изменить интерфейс, если есть):

template<typename InputItrX, typename InputItrY>
set_data(InputItrX beginX, InputItrX endX, InputItrY beginY)
{
  //What exception handling should I do here?
  size_t array_size = endX-beginX;  //get the size of the xarray.
  my_xVector.resize(array_size);    //resize my internal container
  my_yVector.resize(array_size);    //  ..and for the ydata.
  std::copy(beginX, endX, my_xVector.begin());               //copy X
  std::copy(beginY, beginY+array_size, my_yVector.begin());  //copy Y
}

Например, моя программа становится неопределенной, если пользователь запутался в интерфейсе и пишет

set_data(xdata.begin(), ydata.begin(), xdata.end());

или, может быть, их xdata имеет 20 элементов, но их ydata не имеет ни одного.

Можно ли проверить такие ошибки в интерфейсе моей библиотеки?

1 Ответ

1 голос
/ 01 октября 2011

Я бы не стал добавлять какие-либо проверки в метод, но документирую, что спецификация исключения зависит от используемых итераторов.Таким образом, пользователь может использовать проверенные итераторы, если ему не нужны потери производительности или неконтролируемые итераторы, и получить лучшую производительность.Я думаю, что в большинстве реализаций итераторов STL есть утверждения, которые проверяют несовместимость итераторов.Эти ошибки не нужно проверять в режиме выпуска, потому что они являются ошибками программиста.

size_t array_size = endX-beginX;  //get the size of the xarray.
my_xVector.resize(array_size);    //resize my internal container
my_yVector.resize(array_size);    //  ..and for the ydata.

Это делает ваш метод несовместимым с итераторами, у которых нет оператора -operator!Может использоваться только с итератором произвольного доступа.Вы должны извлечь это в шаблон resize_vectors, который может быть реализован для итераторов с произвольным доступом, но не производит никакого изменения размера для других итераторов.В std::copy вы должны использовать итератор вставки, который изменяет размер вектора, вставляя, если векторам не хватает емкости.

...