私は次のクラスを持っています:
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を使用したくありません。それらの1つはポリシーです:
template <class S>
class Policy
{
protected:
float QValue;
S *state;
S *nextState;
public:
...
template <class P>
void updateOptimal(boost::ptr_vector<P> &policies);
}
updateOptimalは、その状態のポリシーを検索するために、状態から派生したクラス(動作に応じて)を取得する必要があります。これは、状態*ptrから現在使用されているSタイプにアップキャストされます。さて、状態から派生したクラスはポリモーフィックであるため、私はそれが正しいことだと思いました。
S *s = dynamic_cast<S *>(iter->getNextState());
ここで、iterはアクションのイテレーターであり、各アクションにはアクションのポインターがあります- State *nextstate;
>nextstateは他のポイントに設定されます。
action->setNextState(dynamic_cast<State *>(state));
State *nextstate;
使用と使用を避けるために、クラスAction全体をテンプレート化することもできます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);
- 安全チェックをスキップして、静的キャストを使用しても大丈夫ですか?私はそれを試しました、そしてそれはコンパイルします。
- チェックを完全にスキップして、reinterpret_castを実行しても大丈夫ですか?私も試してみましたが、コンパイルされます。
- dynamic_castを実行した場合のペナルティは何ですか?小さなオーバーヘッドがあることは知っていますが、それは何か深刻なことですか?
- ポリモーフィッククラスを使用せずに(仮想関数を回避して単純にオーバーライドする)状態*ptrからSタイプ*ptrにアップキャストする方法はありますか?