gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:34 32 4
gpt4 key购买 nike

所以,我有一个基类 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);
}
}
}

最佳答案

我不知道是否有一个简单的 C++ 技巧可以帮助您(您需要的是一次为两个对象解析虚函数...)。

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

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

关于c++ - 使用未知指针类型调用函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23468934/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com