最近學(xué)習(xí)C++11的variadic template argument,終于可以擺脫用fpmacro模板來復(fù)制一大堆代碼的做法了,好開心。這個例子的main函數(shù)用lambda寫了一個斐波那契數(shù)列的遞歸計算函數(shù)。跟以往不同的是,在Y函數(shù)的幫助下,這個lambda表達是可以成功看到自己,然后遞歸調(diào)用。當(dāng)然這仍然需要用普通的C++遞歸來實現(xiàn),并不是λ-calculus那個高大上的Y Combinator。
?
#include
<functional>
#include
<memory>
#include
<iostream>
#include
<string>
?
using
namespace std;
?
template<typename
TResult, typename ...TArgs>
class
YBuilder
{
private:
????function<TResult(function<TResult(TArgs...)>, TArgs...)> partialLambda;
?
public:
????YBuilder(function<TResult(function<TResult(TArgs...)>, TArgs...)> _partialLambda)
????????:partialLambda(_partialLambda)
????{
????}
?
????TResult operator()(TArgs ...args)const
????{
????????return partialLambda(
????????????[this](TArgs ...args)
????????????{
????????????????return
this->operator()(args...);
????????????}, args...);
????}
};
?
template<typename
TMethod>
struct
PartialLambdaTypeRetriver
{
????typedef
void
FunctionType;
????typedef
void
LambdaType;
????typedef
void
YBuilderType;
};
?
template<typename
TClass, typename
TResult, typename ...TArgs>
struct
PartialLambdaTypeRetriver<TResult(__thiscall
TClass::*)(function<TResult(TArgs...)>, TArgs...)>
{
????typedef
TResult
FunctionType(TArgs...);
????typedef
TResult
LambdaType(function<TResult(TArgs...)>, TArgs...);
????typedef
YBuilder<TResult, TArgs...> YBuilderType;
};
?
template<typename
TClass, typename
TResult, typename ...TArgs>
struct
PartialLambdaTypeRetriver<TResult(__thiscall
TClass::*)(function<TResult(TArgs...)>, TArgs...)const>
{
????typedef
TResult
FunctionType(TArgs...);
????typedef
TResult
LambdaType(function<TResult(TArgs...)>, TArgs...);
????typedef
YBuilder<TResult, TArgs...> YBuilderType;
};
?
template<typename
TLambda>
function<typename
PartialLambdaTypeRetriver<decltype(&TLambda::operator())>::FunctionType> Y(TLambda
partialLambda)
{
????return
typename
PartialLambdaTypeRetriver<decltype(&TLambda::operator())>::YBuilderType(partialLambda);
}
?
int
_tmain(int
argc, _TCHAR* argv[])
{
????auto fib = Y([](function<int(int)> self, int
index)
????{
????????return
index<2
?????????????1
????????????:self(index-1)+self(index-2);
????});
?
????for (int i = 0; i < 10; i++)
????{
????????cout << fib(i) << " ";
????}
????cout << endl;
}
posted on 2014-02-28 08:34
陳梓瀚(vczh) 閱讀(11103)
評論(3) 編輯 收藏 引用 所屬分類:
C++實用技巧