我正在尝试为学术目的制作一个自定义碰撞引擎,但我陷入了一个一般的 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 中,它可以编译并且似乎可以正常工作......
是什么让这个演员出现了可怕的错误?
我真的不明白强制转换函数指针意味着什么......
作为后续问题,是否有办法以安全的方式实现这一点