У меня есть class A
, который реализует функцию foo
, которая принимает в качестве аргументов два итератора (из любого контейнера stl). Для того, что я видел, общий подход заключается в использовании шаблона, как показано здесь:
class A{
public:
template <typename It>
void foo(const It& begin, const It& end){
// do stuff
}
};
Проблема в том, что я хочу сделать foo
виртуальным, а шаблоны могут не быть виртуальными, но я не хочу иметь такой шаблон класса:
template <typename It>
class A{
public:
void foo(const It& begin, const It& end){
// do stuff
}
};
потому что это ограничило бы использование foo
в одном объекте одним типом контейнера.
Мой вопрос: есть ли способ использовать итераторы STL в качестве аргументов без использования шаблонов, чтобы можно было сделать такие функции виртуальными и поддерживать их работу с любым контейнером STL?
Изменить
Возможно, это проблема XY, как сказано в комментариях, поэтому я собираюсь объяснить конкретную проблему, чтобы узнать, что вы думаете.
У меня есть абстрактный класс LightSource
с чистой виртуальной функцией void castLight(...) = 0
. Есть два класса, которые наследуются от него и реализуют функцию, RadialLight
и DirectedLight
.
Проблема в том, что для отбрасывания света мне нужен набор объектов Edge
, определяющих сегменты в 2D-мире, которые могут отбрасывать тени. Для алгоритма в castLight
мне нужно перебрать эту коллекцию (не обязательно всю) и выполнить определенную обработку, которая отличается для каждого типа освещения.