Допустим, я хочу сделать что-то вроде этого (это просто пример общей идеи):Правильный способ реализации родовых методов итераторов
class AbstractSortingMethod
{
public:
template<class iterator>
virtual void Sort(iterator begin, iterator end) = 0;
};
, который, очевидно, является незаконным в C++.
Какова правильная конструкция для достижения того же?
Я знаю, что я могу использовать класс шаблонов вместо шаблонов метода, но это не позволит выводить тип, если я не реализую какой-то заводской метод.
Другое дело - должен ли я просто «слепо доверять», что тип, который передается как аргумент шаблона, является итератором?
По запросу в комментариях:
Есть, вероятно, многие другие (возможно, даже лучше) примеры, но это то, что я придумал сейчас.
Представьте себе программу, которая должна оценивать производительность многих различных методов сортировки в контексте множества различных контейнеров.
Существует класс, подобный SortingMethodTest, который содержит несортированные данные во многих разных контейнерах (например, список, обычный массив и вектор и т. Д.). Мы передаем ему функтор метода сортировки, который наследуется от чего-то вроде AbstractSortingMethod, упомянутого ранее в этом сообщении. Эталон процедура будет выглядеть следующим образом:
цикл по всем контейнерам -> StartTimer() -> передать итераторы данного контейнера метод сортировки и запустить его -> StopTimer() -> время записи -> продолжить
Зачем вам полипрофильное поведение здесь? Почему бы не использовать политику? – SergeyA
Не могли бы вы привести пример того, как это будет использоваться? – wally
«Какой правильный дизайн для достижения того же?» - чего вы на самом деле хотите достичь?Для абстрактного метода сортировки потребуется динамический вывод типа, что может затруднить работу программы. –