我目前正在做模板函数的一些练习。 我有任务写一个变换算法的实现。 我做到了像下面和它的作品:lambda与模板
template <class in, class out, class T>
out stransform(in b, in e, out d, T p(const T&)) {
while (b != e)
*d++ = p(*b++);
return d;
}
与正常转换我有打电话给谓语用一个明确的类型一样
stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
现在,我偶然发现了C++ 11 Lambdas,并想打电话给我这样的功能:
stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;});
因此,我得到一个编译器错误,类型不能被推断。 这是我不明白的事情,因为我在我的lambda中实际上定义了两次T型。
我也检查过它正在工作的原始转换函数。然后我检查了那个的implementation,它显然是用一个模板类来实现整个功能的。 这是用模板实现谓词的正确方法吗?
在阅读转换的实现之后,我这么认为,这也使得它变得更容易。我仍然想知道为什么我不在其他情况下工作。 – inf
@bamboon我猜是因为一个lambda函数不是函数,而是一个函数对象,因为它也可以保持状态(它是一个闭包,而不仅仅是一个函数)。 –
请注意,不执行任何捕获的lambda可转换为普通函数(指针)。 – spraff