C++ 为不同类型的参数实现不同的方法

C++ 为不同类型的参数实现不同的方法,c++,polymorphism,overloading,C++,Polymorphism,Overloading,我正在编写一些代码来检测不同形状之间的冲突,RectShape,CircShape,LineShape都是从基类Shape继承的。我当前的实现非常糟糕。首先,我定义了一系列特定于案例的函数: bool LineLineCollision(LineShape& line1, LineShape& line2) { // do some math } bool CircRectCollision(CircShape& circ, RectShape& rec

我正在编写一些代码来检测不同形状之间的冲突,
RectShape
CircShape
LineShape
都是从基类
Shape
继承的。我当前的实现非常糟糕。首先,我定义了一系列特定于案例的函数:

bool LineLineCollision(LineShape& line1, LineShape& line2) {
    // do some math
}

bool CircRectCollision(CircShape& circ, RectShape& rect) {
    // some more math
}

// and so on for all cases
显然,所有这些在任何实现中都是必需的。问题在于函数
booltestcollision(Shape&shp1,Shape&shp2)
,它接受两个参数,然后通过许多if语句将
typeid(shp1)
typeid(shp2)
与我所有派生类的
typeid
进行比较。那里又脏又乱,但我当时没有其他想法。现在我想把它清理干净。添加新类型的形状是难以想象的烦人和耗时

我现在的新想法是简单地使用适合不同参数类型的参数重载
TestCollision
,但是我必须将
TestCollision(CircShape&,RectShape&)
TestCollision(RectShape&,CircShape&)
作为两个独立的重载,这是不可维护的。另一个想法是在派生类本身内部实现函数,但它仍然会导致代码重复,并且更不易维护

如何解决这个问题?

解决方案是使用回调。e、 g

#包括
结构线;
结构电路;
结构形状{
虚空碰撞(线*)=0;
虚空碰撞(Circ*)=0;
虚拟空洞碰撞(形状*)=0;
};
班级路线:公共形态{
私人:
无效冲突(行*)替代{
std::cout冲突(obj3.get());
}
产出:

Line-Circ
Line-Line

这是一个学习C++中模板模板元编程的好时机。使用一些优秀的C++书籍。@ S.M我在头脑中有模板特化,但它有两个问题。第一个是参数是如何排序的。是否可以按任意顺序取两个参数类型?另一个问题是如何告诉函数的类型是什么,这似乎毫无意义,编译器将能够推断出(我认为这与
Shape
是一个纯抽象类的方式有关)是否有可能以任何顺序接受两种参数类型?是的,有可能。