使用未知指针类型调用函数重载

时间:2014-05-05 09:20:21

标签: c++ pointers c++11 overloading dynamic-cast

所以,我有一个基类PhysicsObject,一个子类Colliding,以及两个再次派生的类,StaticNewtonian

检查碰撞时,我将所有碰撞写入std::vector< std::pair< Colliding*, Colliding*> > collisionVector。 (碰撞检测是相当基本的,并不是问题的真正部分。)

现在,在检测到所有冲突后,我迭代collisionVector并调用静态collide方法,该方法有四个重载:

void collide(Newtonian* first, Newtonian* second);
void collide(Newtonian* object, Static* obstacle);
inline void collide(Static* obstacle, Newtonian* object){ collide(object, obstacle); }
void collide(Static* first, Static* second);

问题是我必须检查我每次处理的对象类型,并且我可能会引入更多Colliding的子类。

如何以简单的方式决定调用哪个重载?


当前代码:

这是我的代码目前的样子。不漂亮。

for (pair<Collision*,Collision*> coll : collisionVector){
    Colliding* first = get<0>(coll);
    Colliding* second = get<1>(coll);

    if (Newtonian* firstNewt = dynamic_cast<Newtonian*>(first)){
        if (Newtonian* secNewt = dynamic_cast<Newtonian*>(second)){
            collide(firstNewt, secNewt);
        }
        else if(Static* secStat = dynamic_cast<Static*>(second)){
            collide(firstNewt, secStat);
        }
    }
    else if(Static* firstStat = dynamic_cast<Static*>(first)){
        if (Newtonian* secNewt = dynamic_cast<Newtonian*>(second)){
            collide(firstStat, secNewt);
        }
        else if(Static* secStat = dynamic_cast<Static*>(second)){
            collide(firstStat, secStat);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我不知道是否有一个简单的C ++技巧可以帮助你(你需要的是两个对象的虚拟函数分辨率......)。

如果您只需处理2种具体类型(牛顿和静态),我会保留您已有的代码。如果你想支持更多类型,你需要使你的代码更通用,这样你就不会编写N ^ 2个案例。

我会实现某种碰撞处理注册,您可以在其中注册两种具体类型和处理它们的方法。但这并不容易。