У меня есть функция, которая должна перечислять итератор несколько раз, но в соответствии с MSDN , "Как только вы увеличиваете любую копию входного итератора, ни одна из других копий не может быть безопасно сравнена, разыменованным или увеличенным в дальнейшем. "
Чтобы упростить задачу, вместо создания отдельной реализации для не-прямых итераторов, которые копируют данные и перечисляют копию, я хочу ограничить свой методчтобы принимать только прямые итераторы и отклонять входные итераторы статически.
Сейчас у меня есть что-то вроде:
template<typename It, typename TCallback /*signature: bool(value_type)*/>
bool EnumerateTwice(const It &begin, const It &end, TCallback callback)
{
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
return true;
}
, но ничто не ограничивает It
быть прямым итератором.
Как наложить это ограничение на шаблонную функцию?(C ++ 03)