Хорошо, я отошел от компьютера примерно на 30 секунд, а потом он пришел ко мне.Я был полностью из-за этого, и это было на самом деле простое исправление.
Все, что мне нужно было сделать для оператора if, было так:
if ( it == end_it ) return;
Теперь все работает правильно.Не было необходимости делать расчеты, основываясь на том, где указатель индекса сравнивался с концом.Все, что мне нужно было сделать, это сравнить, если они равны, и если это так, просто вернуть.
Таким образом, полная завершенная функция теперь выглядит так:
// positive direction from begin to end only
template<typename Container, typename Function>
void for_each_by_n(Container&& cont, Function f, unsigned increment_by) {
using std::begin;
auto it = begin(cont);
using std::end;
auto end_it = end(cont);
while (it != end_it ) {
f(*it);
for ( unsigned n = 0; n < increment_by; ++n ) {
if (it == end_it) {
return;
}
++it;
}
}
}
Должно быть, это был синдром coders_block...