如何消除示例代码中的 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() 检查似乎是为了确保动态案例始终成功,因此简单的搜索和替换就足够了。