Почему некоторые функции внутри большой функции написаны как лямбда-выражения в C ++? - PullRequest
0 голосов
/ 08 мая 2018

У меня сложилось впечатление, что написание четких функций, выполняющих только одну вещь, лучше, чем написание относительно более крупной функции, выполняющей более чем одну вещь, и заключающей ее в лямбду?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Когда вы думаете о длине функции, полезно рассматривать тело любых лямбд в ней как , а не часть длины. Представьте себе, что они были извлечены в другом месте и только что на них ссылались.

Сказав это, давайте выделим два случая лямбд:

Захват лямбды

Фактически требуется определить в функции, поскольку альтернативой является создание типа класса с соответствующим 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; });
}

Лямбда без захвата

Здесь это менее отчетливо. Если вам нужна определенная функция только один раз, проще определить лямбда, чем добавлять имя в объем, который выполняет ту же задачу.

0 голосов
/ 08 мая 2018

Довольно часто, особенно в алгоритмах стандартной библиотеки, необходимо предоставить короткую функцию. Некоторые из очевидных примеров этого - супер-короткие функции, которые «сообщают» std::sort, как правильно сравнивать два значения (скажем, вы сортируете вектор своего собственного типа с несколькими ключами и хотите отсортировать «на этот раз» по один из этих ключей).

В этих случаях раньше требовалось (до C ++ 11) написать эту короткую функцию как именованную функцию. Это обычно загрязняет пространство имен, и для решения этой проблемы были введены лямбды.

Это не нарушает принцип "одна функция - одна вещь", поскольку лямбда в этом случае является просто вспомогательным ярлыком для короткого кода на месте, который в противном случае должен был бы быть помещен в автономную именованную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...