考慮下面的玩具代碼,以確定範圍是否包含一個元素:如何從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