学術目的でカスタム衝突エンジンを作成しようとしていますが、一般的な C++ プログラミングの問題に行き詰まりました。適切に機能するすべてのジオメトリが既にあり、衝突テストも適切に機能しています。
エンジンはこれら 2 つのクラスを使用して、テストするジオメトリのキューを作成します。
class collidable;
template<typename geometry_type>
class collidable_object : public collidable;
複数のジオメトリ タイプが可能であるため、テストする衝突を手動で指定する必要はありませんでした。
代わりに、この「テクニック」を使用して二重ディスパッチを実装しました。
class collidable
{
public:
typedef bool (collidable::*collidable_hit_function)(const collidable& ) const;
virtual ~collidable() = 0 {}
virtual collidable_hit_function get_hit_function() const = 0;
};
template<typename geometry_type>
class collidable_object : public collidable
{
public:
explicit collidable_object( geometry_type& geometry ) :
m_geometry( geometry )
{}
~collidable_object(){}
virtual collidable_hit_function get_hit_function() const
{
return static_cast<collidable_hit_function>( &collidable_object<geometry_type>::hit_function<geometry_type> );
}
template<typename rhs_geometry_type>
bool hit_function( const collidable& rhs ) const
{
return check_object_collision<geometry_type, rhs_geometry_type>( *this, rhs );
}
const geometry_type& geometry() const
{
return m_geometry;
}
private:
geometry_type& m_geometry;
};
bool check_collision( const collidable& lhs, const collidable& rhs )
{
collidable::collidable_hit_function hit_func = lhs.get_hit_function();
return (lhs.*hit_func)( rhs );
}
ここで、関数check_object_collision
は衝突をテストするテンプレート関数であり、テスト済みです。
私の質問は次のとおりです:関数のキャストget_hit_function
はコンパイルされますが、疑わしいようです...未定義の動作と複数の悪夢につながる恐ろしい間違ったことをしていますか、それともテンプレートメンバー関数ポインターをある派生クラスから別の派生クラスにキャストしても問題ありませんか? .
私を混乱させているのは、Visual C ++ 2012でこれがコンパイルされ、適切に動作しているように見えることです...
このキャストがひどく間違っている原因は何ですか?
関数ポインターのキャストが何を意味するのかよくわかりません...
フォローアップの質問として、これを安全な方法で実装する方法はありますか