用lambda表达式实现RAII

这几天在看Design Pattern In Ruby,很多设计模式在遇到ruby的proc的时候,会更好写一点。

然后这几天的工作是写一些算法性比较强的C++的代码,既然都用上VS2010了,那么偶尔也用用C++11的labmda表达式。因为算法性比较强,其实写起来基本还是一种面向过程的大函数的感觉, 有点类似于在学校的时候参加的编程竞赛。不过当时最喜欢用的是Pascal,而Pascal是可以在函数里面定义函数的,但是C/C++一直没有被这个功能,有时候为了代码的清晰,不想出去定义函数,就把重复性的代码段尽量重构到不重复;不过有了lambda表达式,这种感觉一扫而空,而且lamba更为灵活,实乃语法糖爱好者的装逼利器。

 

下面这个例子是用lambda表达式结合模板实现RAII功能:

template <class F>
struct RAII
{
	F _f;
	RAII(F f):_f(f) {}
	~RAII() {_f();}
};

template <class F>
RAII<F> MkRAII(F f)
{
	return RAII<F>(f);
}

 调用的时候写 auto scopeholder = MkRAII([&](){/*codes*/}; 即可,当然那个capture写成了“按引用capture所有变量”,也可以用[=]来“拷贝值来capture所有变量”,当然还可以写得更具体写。

 

其实我最怀念的还是Pascal的with关键字,不过正在考虑能不能用labmda结合模版或者宏模拟一个。

 

嗯,另外一点值得一提的是,如果写的算法比较复杂,最好还是草草地画个流程图,先按顺序写上要执行的操作,然后添加逻辑分支,会清晰一点。而且在一年或者更久之后,往往这些草图才能让你回忆起来你写了些什么东西。

你可能感兴趣的:(lambda)