Как ограничить итератор прямым итератором?

У меня есть функция, которая должна перечислять итератор несколько раз, но согласно MSDN , «Как только вы увеличиваете любую копию итератора ввода, после этого ни одна из других копий не может быть безопасно сравнена, разыменована или увеличена ».

Итак, чтобы упростить задачу, вместо создания отдельной реализации для итераторов без пересылки, которые копируют данные и перечисляют копию, я хочу ограничить мой метод только включением итераторов вперед и статическим отклонением итераторов ввода.

Прямо сейчас у меня есть что-то вроде:

template
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)

6
задан Mehrdad 5 January 2012 в 23:32
поделиться