[英]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.