Есть ли способ использовать итераторы STL в качестве аргументов без шаблона?

У меня есть 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 мне нужно перебрать эту коллекцию (не обязательно всю) и выполнить определенную обработку, которая отличается для каждого типа освещения.


person Miguel    schedule 09.02.2021    source источник
comment
Есть некоторые уродливые обходные пути, хотя это пахнет проблемой XY. Шаблоны — это форма полиморфизма времени компиляции. Виртуальные функции — это полиморфизм времени выполнения.   -  person Drew Dormann    schedule 09.02.2021
comment
Возможно, вы могли бы спросить, как решить проблему, для которой, по вашему мнению, требуются функции виртуальных шаблонов?   -  person Drew Dormann    schedule 09.02.2021
comment
@fabian Это выглядит как хороший подход, но я не уверен, что он работает в этом случае. Я собираюсь отредактировать вопрос, чтобы уточнить проблему   -  person Miguel    schedule 10.02.2021
comment
Что такое коллекция? Вы должны иметь возможность использовать: void foo(std::vector‹LightSource*›::const_iterator begin, ... если вы хотите ограничить итераторы определенной коллекцией. Примечание: вам не нужен const перед итератором, вы скорее всего хотите const_iterator.   -  person Zlatomir    schedule 10.02.2021
comment
@Zlatomir Я приму это во внимание, спасибо. Я предполагаю, что мне придется ограничить итераторы определенной коллекцией...   -  person Miguel    schedule 10.02.2021


Ответы (1)


Вы можете использовать определенный тип итератора, например std::vector<int>::iterator. Обратите внимание, что это может отличаться от std::vector<int>::const_iterator, std::deque<int>::iterator и std::vector<unsigned>::iterator, поэтому вы можете получить множество перегрузок.

Вы также можете использовать итератор для стирания типов, например итераторы из boost::any_range или сам any_range.

person Caleth    schedule 09.02.2021
comment
Так что единственный способ - ограничить тип контейнера и перегрузить... Что ж, спасибо! - person Miguel; 10.02.2021