我有以下课程:
class State
{
protected:
Vec3D accel;
Vec3D gyro;
Vec3D gps;
float reward;
public:
boost::ptr_vector<Action> actions;
...
virtual bool isTerm();
}
class guState : public State
{
float gps_stand_thres;
float gps_down_thres;
public:
guState(Agent &A,ACTION_MODE &m);
bool isTerm();
};
还有其他所有类都继承自State。他们之间的区别仅在于他们如何评价依赖于行为的isTerm()。 我宁愿不使用虚函数bur覆盖函数isTerm,如果不是因为有一些其他模板化的类被设计用于各种各样的状态派生类。 其中之一是政策:
template <class S>
class Policy
{
protected:
float QValue;
S *state;
S *nextState;
public:
...
template <class P>
void updateOptimal(boost::ptr_vector<P> &policies);
}
updateOptimal必须获取一个State派生类(取决于行为),从State * ptr向上转换为当前使用的S类型,以便搜索该状态的策略。现在,因为状态派生类是多态的,我认为这是正确的做法:
S *s = dynamic_cast<S *>(iter->getNextState());
其中iter是Actions的迭代器,每个动作的指针都为State *nextstate;
action-&gt; nextstate设置在其他一点:
action->setNextState(dynamic_cast<State *>(state));
我可以模拟整个类Action,以避免使用State *nextstate;
并使用S *nextstate;
,但这需要在整个项目中进行大量更改。
阅读cplusplus.com上的演员教程我的理解是最好使用dynamic_cast,因为它在向上或向下投射之前进行了类型检查。 但是在下面的代码中,除了用于搜索之外,我没有对上升状态做任何事情:
P *temp_pol = var::findPolicy(policies,s);
其中findPolicy是:
template <class P, class S>
P* findPolicy(boost::ptr_vector<P> &policies,S *state);
答案 0 :(得分:4)
static_cast
和dynamic_cast
之间的区别在于无效的static_cast
是未定义的行为,而无效的dynamic_cast
会导致空指针或bad_cast
} -exception(如果你转换引用)。 dynamic_cast
的惩罚是在运行时进行类型检查,并且由于RTTI而增加了代码大小。
所以,如果您确定演员表总是很好,那么您可以安全地使用static_cast
。使用reinterpret_cast
不会比static_cast
提供任何性能提升,因此您不应在此处使用它。