如何消除示例代码中的 RTTI
How to eliminate RTTI in sample code
我正在写一个 k-d 树,我认为在这一点上已经足够好了。我已将整个模板放在 http://private.org.il/Code%20Projects/kd%20tree%20w%20bb%20cache.zipx
我想做的一件事是消除 RTTI,并专门调用 dynamic_pointer_cast。
_____________________ 编辑更多信息 _____________________
相关部分是我使用了三个 classes:一个抽象节点 class,它需要派生 classes 来实现 isInternal() 函数。
有两个 class 派生自它 - 一个内部节点 class(函数 returns 为真)和一个叶节点 class(函数 returns假)。因此,一旦调用 isInternal,我就知道可以将指针转换为两个派生 classes 中的哪一个。
我在消除调用时遇到问题的一个例程是 ApproxNearestNeighborNode,它为最近邻搜索提供了初始猜测。目前看起来像这样
shared_ptr<kd_leaf_node> ApproxNearestNeighborNode(const kd_point &srcPoint) const
{
unsigned int Depth = 0;
shared_ptr<kd_node> Node(m_Root);
while (Node->isInternal())
{
shared_ptr<kd_internal_node> iNode = dynamic_pointer_cast<kd_internal_node>(Node);
if (srcPoint[Depth++%K] <= iNode->splitVal() || iNode->Right() == nullptr)
Node = iNode->Left();
else
Node = iNode->Right();
}
shared_ptr<kd_leaf_node> lNode = dynamic_pointer_cast<kd_leaf_node>(Node);
return lNode;
}
困扰我的两个问题是保持例程迭代而不是递归,以及返回一个指向叶节点的智能指针。
[好的,我认为有一种方法可以使用 shared_from_this,我只是希望有一种方法可以重写尽可能少的代码。]
任何其他反馈将不胜感激,但偏离主题,因此请通过电子邮件发送。
正如 πìντα ῥεῖ 所说,you can replace dynamic_pointer_cast
by static_pointer_cast
。您的 Node->isInternal()
检查似乎是为了确保动态案例始终成功,因此简单的搜索和替换就足够了。
我正在写一个 k-d 树,我认为在这一点上已经足够好了。我已将整个模板放在 http://private.org.il/Code%20Projects/kd%20tree%20w%20bb%20cache.zipx
我想做的一件事是消除 RTTI,并专门调用 dynamic_pointer_cast。
_____________________ 编辑更多信息 _____________________
相关部分是我使用了三个 classes:一个抽象节点 class,它需要派生 classes 来实现 isInternal() 函数。
有两个 class 派生自它 - 一个内部节点 class(函数 returns 为真)和一个叶节点 class(函数 returns假)。因此,一旦调用 isInternal,我就知道可以将指针转换为两个派生 classes 中的哪一个。
我在消除调用时遇到问题的一个例程是 ApproxNearestNeighborNode,它为最近邻搜索提供了初始猜测。目前看起来像这样
shared_ptr<kd_leaf_node> ApproxNearestNeighborNode(const kd_point &srcPoint) const
{
unsigned int Depth = 0;
shared_ptr<kd_node> Node(m_Root);
while (Node->isInternal())
{
shared_ptr<kd_internal_node> iNode = dynamic_pointer_cast<kd_internal_node>(Node);
if (srcPoint[Depth++%K] <= iNode->splitVal() || iNode->Right() == nullptr)
Node = iNode->Left();
else
Node = iNode->Right();
}
shared_ptr<kd_leaf_node> lNode = dynamic_pointer_cast<kd_leaf_node>(Node);
return lNode;
}
困扰我的两个问题是保持例程迭代而不是递归,以及返回一个指向叶节点的智能指针。
[好的,我认为有一种方法可以使用 shared_from_this,我只是希望有一种方法可以重写尽可能少的代码。]
任何其他反馈将不胜感激,但偏离主题,因此请通过电子邮件发送。
正如 πìντα ῥεῖ 所说,you can replace dynamic_pointer_cast
by static_pointer_cast
。您的 Node->isInternal()
检查似乎是为了确保动态案例始终成功,因此简单的搜索和替换就足够了。