C++ 双参数的纯虚函数

C++ 双参数的纯虚函数,c++,C++,当我需要根据对象的类型调用不同的函数时,我使用虚拟方法。但当我有两个未知类型的对象时,我该怎么办?我有每种可能的组合的代码,但实际调用它的最佳方式是什么 示例: 有一个抽象类Shape,它有子类,如点,线,多边形和圆。我们需要一个函数,返回这些形状的最近点之间的最短距离,例如: double shortestDistance(const Shape &first, const Shape &second); 没有办法简化这个问题(至少在我的情况下不是这样),以避免实际上必须为每

当我需要根据对象的类型调用不同的函数时,我使用虚拟方法。但当我有两个未知类型的对象时,我该怎么办?我有每种可能的组合的代码,但实际调用它的最佳方式是什么

示例

有一个抽象类
Shape
,它有子类,如
线
多边形
。我们需要一个函数,返回这些形状的最近点之间的最短距离,例如:

double shortestDistance(const Shape &first, const Shape &second);
没有办法简化这个问题(至少在我的情况下不是这样),以避免实际上必须为每个组合使用不同的代码

我目前的解决方案是让Shape有一个纯虚拟方法,该方法返回其实际类型(作为enum),然后在两个嵌套的switch语句中使用该值,然后再对参数进行类型转换,最后为特定的组合调用相应的函数,如下所示:

switch (first.getType()) {
    case POINT:
        switch (second.getType()) {
            case POINT:
                return shortestDistancePointPoint((const Point &) first, (const Point &) second);
            case LINE:
                return shortestDistancePointLine((const Point &) first, (const Line &) second);
            ...
        }
    case LINE:
        switch (second.getType()) {
            ...
        }
    ...
}

这似乎有点笨拙,但可能效率低下。那么,有没有更好的方法呢?

你想达到什么目的?如果没有背景信息,这很难理解。检查。您是否找到形状中心之间的最短距离,或者从边缘开始的最短距离?如果从中心开始,为什么不让所有形状响应getCenterPoint()消息。这将使计算最短距离变得非常容易,而不需要大量的案例陈述。如果是从边缘开始,那么问题确实更复杂。Boost.Variant支持双重分派基本技巧是在界面上有一个函数,上面写着“performOperationWith(Shape other)”。然后在接口上为每种特定类型的对象提供一个函数(performOperationWith(Box other))。第一个函数只调用其参数上的第二个函数,将自身作为参数传递。第二个对象将获得第一个对象的实际类型,并知道它自己的实际类型,因此它可以调用一个全局函数来处理该组合。简言之,@KennyTM说了什么。