Предположим, у меня есть несколько типов
class A {…};
class B {…};
class C {…};
...
И у меня есть некоторые другие классы, которые делают разные вещи над объектами этих типов
class process1
{
public:
void do_stuff(std::vector<A>& …);
};
class process2
{
public:
void do_stuff(std::vector<B>& …);
void do_stuff(std::vector<C>& …);
};
...
Эти "процессные" классы имеют общий интерфейс (do_stuff()
), поэтому, естественно, я хочу создать класс / шаблон для "регулирования" того, как эти классы должны быть написаны. Я хочу что-то вроде
template <class T>
class process_interface
{
public:
virtual void do_stuff(std::vector<T>& …)
{
// Default implementation.
}
// I might also want this.
// virtual void do_other_stuff(std::vector<T>& …) = 0;
};
и пусть process1
и process2
происходят из него. Таким образом, я говорю, что все классы «процесса» должны иметь do_stuff()
, и что не обязательно писать это явно, потому что есть версия по умолчанию.
Но, конечно, это не работает, потому что process2
имеет 2 версии do_stuff()
. (У некоторых других «процессных» классов может быть больше.) Так есть ли способ достичь того, чего я хочу, с помощью этого «интерфейсного» класса / шаблона? Я думал об использовании шаблона с переменным числом, но я полагаю, что это тоже не сработает.
А теперь вот что у меня есть:
class process_interface
{
public:
template <class T>
void do_stuff(std::vector<T>& …)
{
// Default implementation.
}
// template <class T>
// void do_other_stuff(std::vector<T>& …)
// {
// throw std::runtime_error("Nope.");
// }
};
Но у него есть проблемы. Например, do_stuff()
не может быть виртуальным / чисто виртуальным. И если у меня есть другие методы, которые требуют такой же обработки, например, do_other_stuff()
там, нет никакого способа заставить подклассы иметь do_other_stuff()
для каждого типа, на который можно do_stuff()
включить.