Виртуальных методов не существует, так как они предназначены не для полиморфного (в обычном смысле полиморфизма во время выполнения), а для шаблонов (статический полиморфизм).Обычный подход заключается в том, чтобы иметь функцию, которая принимает итераторы на основе типа итератора.Вы можете найти много примеров в заголовке алгоритма STL:
template <class InputIterator, class Distance>
inline void distance(InputIterator first, InputIterator last, Distance& n);
В вашем конкретном случае:
template <class ForwardIterator> // or InputIterator or whatever your needs are
void acceptIterators( ForwardIterator start, ForwardIterator end );
Дополнительное ограничение на ссылки на строки может быть реализовано в терминахнаберите traits и enable_if:
template <class ForwardIterator>
std::enable_if< std::is_same< std::string,
typename iterator_traits<ForwardIterator>::value_type > >
void acceptIterators( ForwardIterator start, ForwardIterator end );
Использование typetraits из c ++ 0x, но enable_if
и is_same
доступны в boost, если они вам нужны в компиляторе, который их не поддерживает.
Если вам нужно иметь возможность переключать типы итераторов во время выполнения, вы можете посмотреть any_iterator
, который выполняет стирание типов на конкретных итераторах, обеспечивая полиморфный интерфейс во время выполнения.Это описано в статье О противоречии между объектно-ориентированным и общим программированием в C ++ , реализацию можно найти в Adobe STLab .