考虑下面的玩具代码,以确定范围是否包含一个元素:如何从lambda函数中返回?
template<typename Iter, typename T>
bool contains1(Iter begin, Iter end, const T& x)
{
for (; begin != end; ++begin)
{
if (*begin == x) return true;
}
return false;
}
(是的,我知道,有标准库已经完全正常的算法,这不是问题的关键。)
如何我会写for_each
和lambda?以下不起作用...
template<typename Iter, typename T>
bool contains2(Iter begin, Iter end, const T& x)
{
std::for_each(begin, end, [&x](const T& y) {
if (x == y) return true;
});
return false;
}
...因为那只会从lambda返回,而不是从函数返回。
我必须抛出异常才能摆脱lambda?同样,对于这个不涉及lambda的特定问题,可能有十多个更好的解决方案,但这并不是我所要求的。
你不能从lambda这样返回。对编译器来说,Lambda是另一个函数,可以在其他地方传递。将lambda传递给另一个方法会非常愚蠢,在这种方法中,调用会跳到2个级别,不是吗? – nothrow
如果你不想处理所有的元素,你真的不应该使用for_each。 –
你不能这样做。您可以通过许多其他方式实现相同的效果。你有没有一个没有人为的例子,它实际上是值得的? – Mankarse