Допустим, у нас есть базовый класс и два его производных класса; Базовый класс владеет методом execute, и каждый производный класс реализует другую версию этого метода с разными типами и количеством аргументов; Я не могу использовать виртуальный метод, потому что тогда подпись должна быть одинаковой для каждого производного класса; Моя цель - предложить базовый метод выполнения, который принимает любые аргументы, вычитает их типы и отправляет их правильному методу в правильном производном классе; Я взглянул на шаблон Visitor, но я ищу более гибкое и элегантное решение;
edit : Я хочу сохранить эти классы в векторе, поэтому мне нужен базовый класс
Здесь это моя попытка (я не знаю, что поместить в тело базового выполнения) в gcc 4.5 :
class Base {
public:
Base();
~Base();
template<typename ...Args>
void execute(Args... arg)
{
//calls the right method
//execute(int i) or execute(int i, float f)
//as Args are int or int and float
}
};
class DerivedA : public Base
{
public:
DerivedA();
~DerivedA();
void execute(int i){ /*do something with i*/}
};
class DerivedB : public Base
{
public:
DerivedB();
~DerivedB();
void execute(int i, float f){/*do something with i and f*/}
};
void test()
{
Base* b1 = new DerivedA();
Base* b2 = new DerivedB();
int i = 5;
b1->execute(i); //should call DerivedA.execute(int i)
float f = 5.0f;
b2->execute(i, f); //should call DerivedB.execute(int i, float f)
}