Я пытаюсь создать функцию с именем 'step', которая принимает указатель базового класса и выполняет некоторые действия.В настоящее время я использую фиктивный базовый класс, чтобы включить общий интерфейс.
#include <iostream>
using namespace std;
class gym_action //dummy base
{
public:
virtual ~gym_action(){}
};
template<typename T>
class action_helper : public gym_action
{
public :
action_helper(T a) : action_item(a){}
T get_action() {return action_item;}
private:
T action_item;
};
void step(gym_action* act)
{
act = dynamic_cast<action_helper<int>*>(act);
cout<<act->get_action()<<endl;
}
int main()
{
action_helper<int> a(2);
//I will have more action_helper instansiations, like action_helper<Eigen::VectorXf> etc
cout<<a.get_action()<<endl;
step(&a);
}
Этот код завершается с ошибкой gym_class
не имеет функции-члена get_action.Ясно, что причина этого в том, что в базовом классе нет виртуальной функции get_action
.
Однако как я могу это определить?Причины, по которым я сейчас не могу, состоят в том, что каждая шаблонная функция get_action
возвращает свой тип T
.Один из возможных способов - заранее определить все возможные перегрузки в базовом классе, но это кажется плохим дизайном.Есть мысли?