代码之家  ›  专栏  ›  技术社区  ›  Philippe Beaudoin

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

  •  1
  • Philippe Beaudoin  · 技术社区  · 16 年前

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

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

    有更干净的方法吗?

    3 回复  |  直到 16 年前
        1
  •  2
  •   dsimcha    16 年前

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

        2
  •  1
  •   Sergey Teplyakov    16 年前

    C++中有多种方法来模拟多方法。

    以下是一些可以帮助您解决问题的参考资料:

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

    A.亚历山德里斯科” Modern C++ design “第11章。多方法

    MultiMethods in C++: Finding a complete solution 作者:Danil Shopyrin

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

    将多种方法添加到C++的提案草案, here here

        3
  •  0
  •   Chris Lutz    16 年前

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

    这可能不是最有效的方法,但看起来相对简单。

    推荐文章