lambda лучше функтора тем, что мы можем определить ее прямо в том месте где она нужна? А еще какие-то преимущества есть у lambda по сравнению с функторами?
Здравствуйте, Максим Рогожин, Вы писали:
МР>lambda лучше функтора тем, что мы можем определить ее прямо в том месте где она нужна? А еще какие-то преимущества есть у lambda по сравнению с функторами?
Labmda не лучше функтора, labmda и есть функтор.
Если речь о сравнении самописного класса с operator() и лябмды, то, скорее, более компактная запись, и без рутинных действий по захвату контекста вручную.
Класс то тоже можно объявить локальный, прямо в функции, но это сложннее воспринимается.
Впрочем, большая и сложная лямбда тоже сложно воспринимается, поэтому нетривиальный функтор лучше вынести из места вызова в отдельный класс или функцию.
Здравствуйте, Максим Рогожин, Вы писали:
МР>lambda лучше функтора тем, что мы можем определить ее прямо в том месте где она нужна? А еще какие-то преимущества есть у lambda по сравнению с функторами?
Большим преимуществом является автоматический захват используемых переменных. Например используешь в теле лямбды N переменных из окружающего контекста — и все они без дополнительных движений автоматом захватываются.
В случае же отдельного класса тебе для захвата нужно написать Θ(N) дополнительного кода вручную (причём Θ(N) в нескольких местах — в определении самого класса, и в месте захвата). Плюс ещё нужно протащить захватываемые типы, или вывести — что означает создание ко всему прочему вспомогательной make_* (либо C++17).
Здравствуйте, Максим Рогожин, Вы писали:
МР>Привет!
МР>lambda лучше функтора тем, что мы можем определить ее прямо в том месте где она нужна? А еще какие-то преимущества есть у lambda по сравнению с функторами?
Главное преимущество лямбда выражений — это локализация места обработки информации без создания новых сущностей. А так, результат лямбда выражения — это и есть функциональный объект (функтор).
Здравствуйте, Максим Рогожин, Вы писали:
МР>lambda лучше функтора тем, что мы можем определить ее прямо в том месте где она нужна? А еще какие-то преимущества есть у lambda по сравнению с функторами?
У обычной лямбды нет никаких формальных преимуществ по сравнению с локальным классом, имеющим operator(). Generic lambda является аналогом локального класса с шаблоннымoperator(), который по суровым законам C++ нельзя определить (не допускается использовать шаблоны в локальных классах).