2015-11-08 48 views
0

我正在寫一個k-d樹,我認爲此時已足夠好。我把整個模板放在http://private.org.il/Code%20Projects/kd%20tree%20w%20bb%20cache.zipx如何消除示例代碼中的RTTI

我想要做的一件事就是消除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; 
} 

難得倒我是保持常規的迭代,而不是遞歸和智能指針返回葉節點的兩個問題。

[OK,我覺得有一種方法使用shared_from_this做到這一點,我只是希望有辦法做到這一點重寫儘可能少的代碼儘可能]

任何其他反饋意見,將不勝感激,但題外話,所以請通過電子郵件發送。

+1

如果您確定「kd_leaf_Node」繼承了「kd_Node」,則可以執行「static_pointer_cast」。 –

+2

_「任何其他反饋將不勝感激,但脫離主題,所以請通過電子郵件發送。」_咦?我們使用這個評論。 –

+1

因此,您希望人們使用您的所有代碼下載專有的WinZip格式存檔,以便了解發布的代碼段?不可以。如果您需要幫助,請發佈最小自包含示例,如果您想要查看代碼,請嘗試[CodeReview.se](https://codereview.stackexchange.com/)。 – Useless

回答

0

正如由πάνταῥεῖ指出的,you can replace dynamic_pointer_cast by static_pointer_cast。看來您的Node->isInternal()檢查旨在確保動態情況總是成功,因此簡單的搜索和替換就足夠了。

+0

Thanksπάνταῥεῖ&anatolyg! isInternal()旨在讓我知道代碼遇到的是什麼節點類型,並對它進行適當的處​​理,但它使得解決方案能夠快速而平穩地進行,因此爲我解決了這個問題。 –