Когда вы думаете о длине функции, полезно рассматривать тело любых лямбд в ней как , а не часть длины. Представьте себе, что они были извлечены в другом месте и только что на них ссылались.
Сказав это, давайте выделим два случая лямбд:
Захват лямбды
Фактически требуется определить в функции, поскольку альтернативой является создание типа класса с соответствующим operator()
и некоторым инициализатором. Значения таких типов функций не очень полезны вне функции, использующей их. Это как более шаблонный, так и менее локализованный вариант: нет потенциал роста.
например. учитывая
struct Compound
{
int interesting_member;
std::string uninteresting_member;
};
Если вы хотите найти определенный Compound
в std::vector<Compound>
, основанный только на значении interesting_member
, вы можете реализовать его либо
struct CompoundFinder
{
bool operator(const Compound & item) { return item.interesting_member == needle; }
int needle;
}
std::vector<Compound>::iterator find_by_interesting(int needle, std::vector<Compound> & haystack)
{
return std::find_if(haystack.begin(), haystack.end(), CompoundFinder{ needle });
}
или с лямбдой захвата
std::vector<Compound>::iterator find_by_interesting(int needle, std::vector<Compound> & haystack)
{
return std::find_if(haystack.begin(), haystack.end(),
[needle](const Compound & item)
{ return item.interesting_member == needle; });
}
Лямбда без захвата
Здесь это менее отчетливо. Если вам нужна определенная функция только один раз, проще определить лямбда, чем добавлять имя в объем, который выполняет ту же задачу.