簡體   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