繁体   English   中英

如何在示例代码中消除RTTI

[英]How to eliminate RTTI in sample code

我正在写一棵kd树,我认为这已经足够了。 我将整个模板放在http://private.org.il/Code%20Projects/kd%20tree%20w%20bb%20cache.zipx

我想做的一件事是消除RTTI,特别是对dynamic_pointer_cast的调用。

_____________________编辑更多信息_____________________

相关的部分是我使用了三个类:一个抽象节点类,它需要它的派生类来实现isInternal()函数。

从中派生两个类-内部节点类(函数返回true)和叶节点类(函数返回false)。 因此,一旦调用isInternal,我就知道指针可以投射到两个派生类中的哪一个。


我在消除调用时遇到的一个例程是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来完成,我只是希望有一种方法可以重写尽可能少的代码。]

任何其他反馈将不胜感激,但不涉及主题,因此请通过电子邮件发送。

正如πάνταῥεῖ指出, 可以更换dynamic_pointer_cast通过static_pointer_cast 看来,您的Node->isInternal()检查是为了确保动态情况始终成功,因此简单的搜索和替换就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM