Es ist ziemlich einfach. Zum Beispiel lassen; s Druckwerte von Vektor unter Verwendung von Lambda:
#include <algorithm>
#include <vector>
#include <iostream>
int main (int argc, char* argv[]) {
std::vector <int> data{1,2,3,4};
std::for_each (data.begin(), data.end(), [] (const int val) { std::cout << val << std::endl;});
return 0;
}
letztes Argument [] (...) ist das Lambda. Eine Funktion, die Lambda-Ausdrücke akzeptiert, könnte wie folgt aussehen:
template <typename E, typename FuncType>
void Graph<E>::bfsTraverse (FuncType func)
{
/* some code not necessary to describe */
}
UPDATE
Bei einem Diagramm Sie Folgendes tun sollten. Die Implementierung Ihres Graphen sollte eine Methode haben, um auf Vertices zuzugreifen: es kann 'getRoot', 'getSource', 'getAllNodes' sein, es ist die Implementierung definiert. Ich bleibe bei 'getRoot'. Jeder Knoten/Knoten sollte eine Methode haben wie 'getAdjacentVertices', 'getChildren', was auch immer. Kombinieren alle zusammen:
template <typename E, typename FuncType>
void Graph<E>::bfsTraverse (FuncType func)
{
std::queue<Node> q;
auto&& root = getRoot();
q.push (root);
while (not q.empty()) {
auto&& current = q.front();
q.pop();
func (current);
auto&& adjacent = current.getAdjacent();
for (auto&& a: adjacent) {
q.push (a);
}
}
Seien Sie sich bewusst, dass ich bewusst die Liste der besuchten Knoten und andere Dinge weglassen. Aber die Idee selbst bleibt gleich. Jetzt können Sie diese Funktion wie folgt aufrufen:
Graph<E> g;
g.bfsTraverse ([] (const Node& n) {
std::cout << n.to_str() << std::endl;
}
);