Recursive Lambda in C++
2012-03-05 18:43
399 查看
C++ 标准委员会真是太死板了,既然给 C++ 增加了 lambda,就真的按部就班地套用 lambda 的标准定义,也不加个 lambda的自引用机制。找了半天,除了那些学院派的足以把99%的人搞晕的 Fix Point + Y combinator,一个最实用的解决方案就是把 lambda bind 到 std::function<...>.
我那段需要 recursive lambda 的代码:
这是以 DFS 顺序打印 Tree Shape Automata 的代码,为了各种原因(内存,速度,简洁),设计了一个通用的 for_each_move 来遍历指定 state 的每个直接 target。
如果有 recursive lambda,这代码要更简洁高效一点(假定 [[]] 是引用lambda 自身的那个符号):
加一个自引用的符号多容易呀!
我那段需要 recursive lambda 的代码:
void print_output() const { // use recursive lambda std::string str; std::function<void(state_id_t,state_id_t,char_t)> lambda = [&](state_id_t source,state_id_t target,char_t c) { str.push_back(c); if (is_term(target)) cout <<str << '\n'; for_each_move(target, lambda); str.resize(str.size()-1); // pop_back }; for_each_move(initial_state, lambda); }
这是以 DFS 顺序打印 Tree Shape Automata 的代码,为了各种原因(内存,速度,简洁),设计了一个通用的 for_each_move 来遍历指定 state 的每个直接 target。
如果有 recursive lambda,这代码要更简洁高效一点(假定 [[]] 是引用lambda 自身的那个符号):
void print_output() const { // use recursive lambda std::string str; for_each_move(initial_state, [&](state_id_t, state_id_t target, char_t c) { str.push_back(c); if (is_term(target)) cout <<str << '\n'; for_each_move(target, [[]]); str.resize(str.size()-1); // pop_back }); }这是 C++ Committee 故意的!它就是要让大家难受,以昭显他们的 Pure Academic,他们的 Pure Mathematic!
加一个自引用的符号多容易呀!
相关文章推荐
- Recursive Lambda in C++
- Lambda expression in C++ & Haskell || C++ 中的匿名函数 [EN/CN]
- Lambda Expressions in C++
- lambda in c++
- C++ 11: lexical closure in lambda function, example 1
- The Usage of Lambda and Heap in the C++ STL
- 《C++ Concurrency in Action》笔记13 std::recursive_mutex
- Lambda Expressions in C++
- Recursive Lambda Expressions in C#
- Sinking events from managed code in unmanaged C++
- 如何将C++中的SOCKADDR_IN*参数类型转换成C#中的参数类型
- GC in C++
- parent-childRecursive sum in parent-child hierarchy T-SQL
- Some topics in C++
- Lambda Expression in C#
- [ Extending Lua with c/c++ ] & [ Embedding Lua in c/c++ ]
- CFStringRef to cstring in c++
- [C++]LeetCode: 44 Search in Rotated Sorted Array II
- Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of
- 【ThinkingInC++】26、下推栈(push_down stack)不会越出内存