我正在尝试构建一个名为“ 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
。一种可能的方式是我在基类中提前定义所有可能的重载,但这似乎是一个糟糕的设计。有什么想法吗?
答案 0 :(得分:1)
即使在dynamic_cast
之后,变量act
仍然是类型gym_action*
。因此,您可能无法在其上调用派生类成员函数。
使用新变量。
auto temp = dynamic_cast<action_helper<int>*>(act);
if ( temp != nullptr )
{
cout << temp->get_action() << endl;
}