私はまだラムダの経験があまりありませんが、ラムダがとても好きになり始め、意味のある場所や、ラムダが進むべき道だと感じた場所で使用しています。
とにかく、と呼ばれる1つの仮想コールバック関数を持つクラスTree
を持つクラスがあります。その Visitor クラスは、すべてのノードを再帰的にウォークします。このコールバックを使用すると、各ノードからデータを収集できます (または、ツリーのパスを抽出できます (これは基本的にこの関数で行うことです))。Tree::Visitor
visit(/*args*/)
そのため、ラムダを取得し、内部でクラスを使用して、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
。どういうわけか、これは正しく機能していません。少なくとも、期待する適切な/完全な結果が得られません。Priority キュー変数を A のメンバーとして (現在のように) 定義し、MyVistor で親ポインターを使用してアクセスすると、適切な結果が得られ、すべて問題ありません。
que
クラス A でメンバーとして定義する代わりに、VisitTheTree() でローカルに定義する良い方法はありますか? MyVistor の外部の変数にアクセスできないため (このように)、コンストラクターで渡す必要があることはわかっています。
ところで、C++0x - lambda expression does look same as Java's anonymous inner class?という質問を見つけました。これは、私が抱えている問題/質問に近いものです。興味深いのは、ヨハネスからの答えです。
ヒントやアイデアは大歓迎です。あなたの考えと助けをありがとう!