我正在编写一个四叉树类作为图形库的一部分,我正面临一个设计问题。一个主要目标是允许库的用户使用他们自己的节点类型轻松扩展四叉树。每个节点都有一个指向其四个子节点中的第一个的指针。在拆分父节点时,我使用原型模式四次“克隆”父节点(库不知道其真实类型)。所以这里是 Node 类:
class CNode {
public:
virtual CNode* clone();
protected:
CNode* pChilds;
}
库的用户现在可以定义自己的节点并添加 traverse 方法:
class MyNode : public CNode {
public:
virtual CNode* clone() {
return new MyNode;
}
void myTraverse() {
if(pChilds[0] != nullptr)
static_cast<MyNode*>(pChilds[0])->traverse();
}
}
可以看出,我必须从基类到派生类进行强制转换。或者,我可以制作所有与四叉树相关的类模板,但我真的不想这样做。我也不能使用升压。除了 boost:: 任何具有 RTTI 或动态转换的类似解决方案都会变慢,因为四叉树是性能关键组件,必须尽可能快地运行!
是否有可能在增加一些类型安全性的同时保持 static_cast 的速度?(四叉树将只包含单一类型的节点)。