我正在寫一個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做到這一點,我只是希望有辦法做到這一點重寫儘可能少的代碼儘可能]
任何其他反饋意見,將不勝感激,但題外話,所以請通過電子郵件發送。
如果您確定「kd_leaf_Node」繼承了「kd_Node」,則可以執行「static_pointer_cast」。 –
_「任何其他反饋將不勝感激,但脫離主題,所以請通過電子郵件發送。」_咦?我們使用這個評論。 –
因此,您希望人們使用您的所有代碼下載專有的WinZip格式存檔,以便了解發布的代碼段?不可以。如果您需要幫助,請發佈最小自包含示例,如果您想要查看代碼,請嘗試[CodeReview.se](https://codereview.stackexchange.com/)。 – Useless