Si consideri il seguente codice giocattolo per determinare se un campo contiene un elemento:Come ritorno da una funzione all'interno di 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 so, ci sono algoritmi già perfettamente bene nella libreria standard, non è questo il punto.)
Come scriverei la stessa cosa con for_each
e un lambda? Ciò che segue non funziona ...
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;
}
... perché ciò restituirebbe solo dal lambda, non dalla funzione.
Devo fare un'eccezione per uscire dalla lambda? Ancora una volta, ci sono probabilmente una dozzina di soluzioni migliori per questo problema specifico che non coinvolgono affatto lambda, ma non è quello che sto chiedendo.
Non è possibile tornare da lambda in questo modo. Lambda è, per il compilatore, un'altra funzione, può essere passata da qualche altra parte. Sarebbe piuttosto sciocco passare il lambda a un altro metodo, dove la sua chiamata salta di 2 livelli, non è vero? – nothrow
Non dovresti davvero usare for_each se non vuoi elaborare tutti gli elementi. –
Non puoi farlo. Puoi ottenere lo stesso effetto in molti altri modi. Hai un esempio non forzato in cui sarebbe effettivamente utile? – Mankarse