我对 lambdas 的经验还不是很丰富,但我开始非常喜欢它们,并在有意义的地方使用它们,并且我觉得它们是要走的路。
无论如何,我有一个类Tree
,Tree::Visitor
该类具有一个名为visit(/*args*/)
. 该访问者类对所有节点进行递归遍历。通过这个回调,我可以从每个节点收集数据(或者更好的是我可以提取树的路径(这基本上就是我使用这个函数所做的)。
所以我取了一个 lambda,在里面我使用一个类来实现visit
回调函数,方法是从Tree::Visitor
.
// Tree class, a rough view how it looks
class Tree {
// ...
// Visitor class for recursive walking the tree
class Visitor {
//
void count(/* ... */) {
// in here the implemented visit(/*args*/) fct is called
}
// ...
void triggerVisit() {
// ...
count(/* ... */);
// ...
}
// visitor callback
virtual void visit(/* args */) = 0;
};
};
class A {
Tree tree;
PriorityQueue que;
A() : tree(), que(maxEntries) {}
// first build the tree ...
void buildTheTree() {
tree.buildTree();
}
// walk the tree
void visitTheTree() {
std::shared_ptr<Tree::Visitor>(
[&]()->Tree::Visitor * {
// this class implements visit(/*args*/)
class MyVisitor : public Tree::Visitor {
A& parent; // pointer to A
Myvisitor(A& p)
: Tree::Visitor(p.tree), parent(p) {}
// implementation
virtual void visit( /* args */ ) {
// ... get somedata
if (/* condition true */) {
parent.que.push(somedata);
}
}
};
return new MyVisitor(*this);
}()
)->triggerVisit();
// get the collected data from que
while(que.size() > 0) {
// ...
}
}
};
基本上这就是我所拥有的,它可以正常工作。
我有一个que
用于存储的优先级队列somedata
,它们是n
树中得分最高的节点。此时,它que
被定义为 class 的成员A
,我不喜欢,因为我只需要收集 visitTheTree 成员内部的数据,所以它可能是一个局部变量所以我的问题更多是设计/风格的问题,我感觉我错过了 c++11 标准的一些东西(也许)。
我试图在que
里面定义visitTheTree()
并使用MyVisitor
. 不知何故,这无法正常工作,至少我没有得到我期望的正确/完整的结果。当我将优先级队列变量定义为 A 的成员(就像现在一样)并使用 MyVistor 中的父指针访问它时,我得到了正确的结果,一切都很好。
有没有什么好的方法可以que
在 VisitTheTree() 中本地定义,而不是在 A 类中将其定义为成员?我知道我必须将它与构造函数一起传递,因为我无法访问 MyVistor 之外的变量(就像这样)。
顺便说一句,我发现问题C++0x - lambda 表达式确实与 Java 的匿名内部类相同?这接近我遇到的问题/问题。有趣的是约翰内斯的回答。
欢迎任何提示或想法。感谢您的想法和帮助!