Consideremos el siguiente código de juguete para determinar si un rango contiene un elemento:¿Cómo regreso desde una función dentro de una 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;
}
(Sí, lo sé, ya hay perfectamente bien algoritmos en la biblioteca estándar, que no es el punto.)
Cómo ¿Escribiría lo mismo con for_each
y una lambda? Lo siguiente no funciona ...
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;
}
... porque eso solo volvería de la lambda, no de la función.
¿Tengo que lanzar una excepción para salir de la lambda? Nuevamente, hay probablemente una docena de mejores soluciones para este problema específico que no involucran a lambdas en absoluto, pero eso no es lo que estoy pidiendo.
No se puede volver de esta manera lambda. Lambda es, para el compilador, otra función, se puede pasar a otro lugar. Sería bastante tonto pasar lambda a otro método, donde su llamada saltaría 2 niveles, ¿no? – nothrow
Realmente no debería usar for_each si no desea procesar todos los elementos. –
No puedes hacer esto. Puede lograr el mismo efecto de muchas otras maneras. ¿Tiene un ejemplo no artificial en el que realmente valdría la pena? – Mankarse