C++实现的一个可以写递归lambda的Y函数
2023-06-13 09:15:38 时间
最近学习C++11的variadictemplateargument,终于可以摆脱用fpmacro模板来复制一大堆代码的做法了,好开心。这个例子的main函数用lambda写了一个斐波那契数列的递归计算函数。跟以往不同的是,在Y函数的帮助下,这个lambda表达是可以成功看到自己,然后递归调用。当然这仍然需要用普通的C++递归来实现,并不是λ-calculus那个高大上的YCombinator。
#include<functional> #include<memory> #include<iostream> #include<string> usingnamespacestd; template<typenameTResult,typename...TArgs> classYBuilder { private: function<TResult(function<TResult(TArgs...)>,TArgs...)>partialLambda; public: YBuilder(function<TResult(function<TResult(TArgs...)>,TArgs...)>_partialLambda) :partialLambda(_partialLambda) { } TResultoperator()(TArgs...args)const { returnpartialLambda( [this](TArgs...args) { returnthis->operator()(args...); },args...); } }; template<typenameTMethod> structPartialLambdaTypeRetriver { typedefvoidFunctionType; typedefvoidLambdaType; typedefvoidYBuilderType; }; template<typenameTClass,typenameTResult,typename...TArgs> structPartialLambdaTypeRetriver<TResult(__thiscallTClass::*)(function<TResult(TArgs...)>,TArgs...)> { typedefTResultFunctionType(TArgs...); typedefTResultLambdaType(function<TResult(TArgs...)>,TArgs...); typedefYBuilder<TResult,TArgs...>YBuilderType; }; template<typenameTClass,typenameTResult,typename...TArgs> structPartialLambdaTypeRetriver<TResult(__thiscallTClass::*)(function<TResult(TArgs...)>,TArgs...)const> { typedefTResultFunctionType(TArgs...); typedefTResultLambdaType(function<TResult(TArgs...)>,TArgs...); typedefYBuilder<TResult,TArgs...>YBuilderType; }; template<typenameTLambda> function<typenamePartialLambdaTypeRetriver<decltype(&TLambda::operator())>::FunctionType>Y(TLambdapartialLambda) { returntypenamePartialLambdaTypeRetriver<decltype(&TLambda::operator())>::YBuilderType(partialLambda); } int_tmain(intargc,_TCHAR*argv[]) { autofib=Y([](function<int(int)>self,intindex) { returnindex<2 ?1 :self(index-1)+self(index-2); }); for(inti=0;i<10;i++) { cout<<fib(i)<<""; } cout<<endl; }
相关文章
- c++语言截取字符串,详解C++ string常用截取字符串方法
- 【说站】英特尔宣布推出LLVM架构的C/C++编译器
- c++int转换成char_字符数字转为int型
- Java 和 C++ 之间的相似之处
- C/C++ 实现获取Linux系统参数
- 一步一步地完成题目——费解的开关(C/C++语言)递推、递归、顺序思维
- 数据结构小记【Python/C++版】——散列表篇
- C++11:可变参数模板/lambda表达式
- c++基础篇之C++ 模板
- Linux基础:讲解Linux C++多线程同步的方式
- VS Code 编译C++详解编程语言
- C++快速排序(递归)算法详解
- C++汉诺塔递归算法完全攻略
- 二叉树遍历非递归C++实现代码
- C++卸载程序功能示例
- c++递归解数独方法示例
- C++递归删除一个目录实例