for_each 中的 c++ "this" 指针
c++ "this" pointer in for_each
我正在阅读别人的代码,这部分让我很困惑。任何人都可以向我解释 *this
在这里指的是什么以及这一行 (for_each(node->items.begin(), node->items.end(), *this);
) 的作用吗?这段代码来自于在 R/R* 树中搜索一个元素。我认为这里我们应该为 for_each(begin,end,functor)
提供一个仿函数,但我不知道 *this
(在我看来它是“node->items
”向量的一个元素)实际上会做什么。
// this functor recursively walks the tree
template <typename Acceptor, typename Visitor>
struct QueryFunctor : std::unary_function< const BoundedItem, void > {
const Acceptor &accept;
Visitor &visitor;
explicit QueryFunctor(const Acceptor &a, Visitor &v) : accept(a), visitor(v) {}
void operator()(BoundedItem * item)
{
Node * node = static_cast<Node*>(item);
if (visitor.ContinueVisiting && accept(node))
{
if (node->hasLeaves)
for_each(node->items.begin(), node->items.end(), VisitFunctor<Acceptor, Visitor>(accept, visitor));
else
for_each(node->items.begin(), node->items.end(), *this);
}
}
};
R* tree是一种查询性能较好的R树(但构建成本略高)。 R树是一种包含目录(非结束节点)和叶子(结束节点)的数据结构。节点的成员 bool hasLeaves
表示该节点是包含目录(hasLeaves
是 false
)还是叶子(hasLeaves
是 true
)。目录只是递归遍历而已,而叶子才是我们感兴趣的。
当代码调用 for_each(..., *this)
时,它将为给定范围内的每个项目调用 QueryFunctor::operator()(BoundedItem * item)
。 for_each
可以接受一个函数或一个带有给定参数的 operator(),在这种情况下它是 operator()。给定范围的元素实际上是 Node*
类型,但是 Node
是从 BoundedItem
派生的,因此参数类型匹配。这在您在 static_cast
行中提供的代码中可见,但为了更好地理解,我阅读了完整的代码 here.
我正在阅读别人的代码,这部分让我很困惑。任何人都可以向我解释 *this
在这里指的是什么以及这一行 (for_each(node->items.begin(), node->items.end(), *this);
) 的作用吗?这段代码来自于在 R/R* 树中搜索一个元素。我认为这里我们应该为 for_each(begin,end,functor)
提供一个仿函数,但我不知道 *this
(在我看来它是“node->items
”向量的一个元素)实际上会做什么。
// this functor recursively walks the tree
template <typename Acceptor, typename Visitor>
struct QueryFunctor : std::unary_function< const BoundedItem, void > {
const Acceptor &accept;
Visitor &visitor;
explicit QueryFunctor(const Acceptor &a, Visitor &v) : accept(a), visitor(v) {}
void operator()(BoundedItem * item)
{
Node * node = static_cast<Node*>(item);
if (visitor.ContinueVisiting && accept(node))
{
if (node->hasLeaves)
for_each(node->items.begin(), node->items.end(), VisitFunctor<Acceptor, Visitor>(accept, visitor));
else
for_each(node->items.begin(), node->items.end(), *this);
}
}
};
R* tree是一种查询性能较好的R树(但构建成本略高)。 R树是一种包含目录(非结束节点)和叶子(结束节点)的数据结构。节点的成员 bool hasLeaves
表示该节点是包含目录(hasLeaves
是 false
)还是叶子(hasLeaves
是 true
)。目录只是递归遍历而已,而叶子才是我们感兴趣的。
当代码调用 for_each(..., *this)
时,它将为给定范围内的每个项目调用 QueryFunctor::operator()(BoundedItem * item)
。 for_each
可以接受一个函数或一个带有给定参数的 operator(),在这种情况下它是 operator()。给定范围的元素实际上是 Node*
类型,但是 Node
是从 BoundedItem
派生的,因此参数类型匹配。这在您在 static_cast
行中提供的代码中可见,但为了更好地理解,我阅读了完整的代码 here.