让我先从一个具体的例子开始。在C ++中,我在抽象基类CollisionVolume
下有一个类层次结构。任何碰撞体积都需要detectCollision
与任何其他体积。此冲突代码基于存在的两个子类进行了专门化,但它是可交换的:detectCollision(a, b) == detectCollision(b, a)
。
我需要使用类似于虚函数的机制,因为对象通常是抽象基类。但是,如果我使用典型的虚方法,则所选择的函数只能依赖于其中一个操作数的类型,而不是两者。我能够做到这一点的唯一方法是使用RTTI或类似RTTI的机制。
有没有更干净的方法呢?
答案 0 :(得分:2)
您正在寻找multiple dispatch。 C ++没有它,因为它很难有效地实现。大多数其他静态类型/效率导向的语言也没有。您的RTTI解决方案可能是伪造它的最佳方式。
答案 1 :(得分:1)
有几种解决方案可以在C ++中模拟多方法。
这里有一些参考资料可以帮助您解决问题:
S.Meyers“More effective C++”,第31项:使函数相对于多个对象是虚拟的。
A.Alexandrescu“Modern C++ design”,第11章.Multime方法
Danil ShopyrinMultiMethods in C++: Finding a complete solution
Multiple Dispatch. A new approach using templates and RTTI,Carlo Pescio博士,C ++报告,1998年6月。
的提案草案答案 2 :(得分:0)
我最初的想法,在阅读时似乎是visitor pattern(?),是制作一个虚拟函数,返回关于对象的一些重要信息,然后,在detectCollision()
中,比较重要的两个对象返回的信息。这样,每个对象都可以返回专门的信息,但可以通用的方式进行比较。
这可能不是最有效的方式,但似乎相对简单。