Как создать версию шаблона для массива начала и конца (с T * и It) без дублированного кода? - PullRequest
2 голосов
/ 25 сентября 2019

Когда я создаю функцию, которая будет принимать begin и end массива (скажем, для создания quick_sort), я должен создать версию, которая принимает T *:

template<typename T> void quick_sort(T *_beg, T *_end){...}

и

template<typename It> void quick_sort(It _beg, It _end);

Так что я могу использовать функцию в std::vector и других контейнерах, а также во встроенных массивах.

Но во избежание дублирования кода единственное, что находится ввторая версия:

{
    quick_sort(&*_beg, &*_end);
}

Работает хорошо ... в большинстве случаев, но иногда я получаю ошибку

can't dereference out of range vector iterator

За попытку разыменования итератора end (ИспользованиеVisual Studio Compiler).

Как безопасно разработать обе версии, избегая дублирования кода?

1 Ответ

5 голосов
/ 25 сентября 2019

Указатель является итератором .Поэтому, чтобы избежать дублирования, просто полностью удалите первую версию и придерживайтесь абстракции (итераторы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...