具有两个操作数的虚函数可以采用多种不同类型

时间:2010-02-03 23:52:26

标签: c++ oop virtual-functions multiple-dispatch

让我先从一个具体的例子开始。在C ++中,我在抽象基类CollisionVolume下有一个类层次结构。任何碰撞体积都需要detectCollision与任何其他体积。此冲突代码基于存在的两个子类进行了专门化,但它是可交换的:detectCollision(a, b) == detectCollision(b, a)

我需要使用类似于虚函数的机制,因为对象通常是抽象基类。但是,如果我使用典型的虚方法,则所选择的函数只能依赖于其中一个操作数的类型,而不是两者。我能够做到这一点的唯一方法是使用RTTI或类似RTTI的机制。

有没有更干净的方法呢?

3 个答案:

答案 0 :(得分:2)

您正在寻找multiple dispatch。 C ++没有它,因为它很难有效地实现。大多数其他静态类型/效率导向的语言也没有。您的RTTI解决方案可能是伪造它的最佳方式。

答案 1 :(得分:1)

有几种解决方案可以在C ++中模拟多方法。

这里有一些参考资料可以帮助您解决问题:

S.Meyers“More effective C++”,第31项:使函数相对于多个对象是虚拟的。

A.Alexandrescu“Modern C++ design”,第11章.Multime方法

Danil Shopyrin

MultiMethods in C++: Finding a complete solution

Multiple Dispatch. A new approach using templates and RTTI,Carlo Pescio博士,C ++报告,1998年6月。

将多方法添加到C ++,herehere

的提案草案

答案 2 :(得分:0)

我最初的想法,在阅读时似乎是visitor pattern(?),是制作一个虚拟函数,返回关于对象的一些重要信息,然后,在detectCollision()中,比较重要的两个对象返回的信息。这样,每个对象都可以返回专门的信息,但可以通用的方式进行比较。

这可能不是最有效的方式,但似乎相对简单。