我想知道在C++中我们应该在functor中使用lambda表达式.对我来说,这两种技术基本相同,甚至算法也比lambda更优雅,更清洁.例如,如果我想重用我的谓词,我必须一遍又一遍地复制lambda部分.所以lambda什么时候真正进入?
Ste*_*sop 18
lambda表达式创建了一个无名的函子,它是语法糖.
因此,如果它使您的代码看起来更好,则主要使用它.如果(a)你不打算重用仿函数,或者(b)你要重用它,但是从代码中完全与当前代码完全无关,为了分享它,你通常会发生这种情况.最终创建my_favourite_two_line_functors.h,并有不同的文件取决于它.
几乎与您键入任何代码行的条件相同,而不是将代码块抽象为函数.
也就是说,使用C++ 0x中的range-for语句,在某些地方你可能会使用仿函数,之后它可能会使代码看起来更好,现在将代码编写为循环体,而不是仿函数或者拉姆达.
Edw*_*nge 17
1)这是微不足道的,试图分享它是更多的工作而不是利益.
2)定义一个仿函数只会增加复杂性(由于必须制作一堆成员变量和废话).
如果这两件事都不对,那么也许你应该考虑定义一个仿函数.
编辑:似乎你需要一个例子,说明在一个仿函数上使用lambda会很好.干得好:
typedef std::vector< std::pair<int,std::string> > whatsit_t;
int find_it(std::string value, whatsit_t const& stuff)
{
auto fit = std::find_if(stuff.begin(), stuff.end(), [value](whatsit_t::value_type const& vt) -> bool { return vt.second == value; });
if (fit == stuff.end()) throw std::wtf_error();
return fit->first;
}
Run Code Online (Sandbox Code Playgroud)
如果没有lambdas,你必须使用类似于现场构造一个仿函数的东西,或者编写一个外部可链接的仿函数对象,这些东西非常烦人.
顺便说一句,我想也许wtf_error是一个扩展.
不重复的小功能.
关于仿函数的主要抱怨是它们与使用它们不在同一个地方.因此,您必须在上下文中找到并阅读仿函数到它所使用的位置(即使它只在一个地方使用).
另一个问题是仿函数需要一些布线来将参数引入仿函数对象.并不复杂但是所有基本的样板代码.锅炉板容易出现切割和粘贴问题.
Lambda尝试并解决这两个问题.但是如果函数在多个地方重复或者大于(不能想出适当的术语,因为它将是上下文敏感的)小,我会使用仿函数.