출처: https://www.bfilipek.com/2020/05/lambdasadvantages.html
1. 가독성을 좋게한다.
C++03의 코드
#include <algorithm> #include <functional> #include <vector>
int main() { using std::placeholders::_1;
const std::vector<int> v { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; const auto val = std::count_if(v.begin(), v.end(), std::bind(std::logical_and<bool>(), std::bind(std::greater<int>(),_1, 2), std::bind(std::less_equal<int>(),_1,6)));
return val; } |
Modern C++
#include <algorithm> #include <vector>
int main() { std::vector<int> v { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; const auto val = std::count_if(v.begin(), v.end(), [](int v) { return v > 2 && v <= 6;});
return val; } |
2. 람다는 코드 국소성을 향상 시킨다

3. 람다는 간단하게 상태를 보존할 수 있다
#include <algorithm> #include <iostream> #include <vector>
int main() { std::vector<int> vec { 0, 5, 2, 9, 7, 6, 1, 3, 4, 8 };
size_t compCounter = 0; std::sort(vec.begin(), vec.end(), [&compCounter](int a, int b) { ++compCounter; return a < b; });
std::cout << "number of comparisons: " << compCounter << '\n';
for (auto& v : vec) std::cout << v << ", "; } |
4. 람다는 동일 장소에 복수의 오버로드를 허용한다
std::variant와 std::visit를 사용한다
#include <iostream> #include <string> #include <variant>
template<class... Ts> struct overload : Ts... { using Ts::operator()...; }; template<class... Ts> overload(Ts...) -> overload<Ts...>;
int main() { std::variant<int, float, std::string> intFloatString { "Hello" }; std::visit(overload { [](const int& i) { std::cout << "int: " << i; }, [](const float& f) { std::cout << "float: " << f; }, [](const std::string& s) { std::cout << "string: " << s; } }, intFloatString ); } |
위의 코드는 아래 코드와 같다
struct PrintVisitor { void operator()(int& i) const { std::cout << "int: " << i; }
void operator()(float& f) const { std::cout << "float: " << f; }
void operator()(const std::string& s) const { std::cout << "string: " << s; } }; |
추가로 variant에 저장된 모든 타입에서 동작하는 컴팩트한 범용 람다를 쓸 수도 있다.
std::variant와 std::visit를 토대로 실행 시에 다양성을 지원한다.
#include <variant>
struct Circle { void Draw() const { } }; struct Square { void Draw() const { } }; struct Triangle { void Draw() const { } };
int main() { std::variant<Circle, Square, Triangle> shape; shape = Triangle{}; auto callDraw = [](auto& sh) { sh.Draw(); }; std::visit(callDraw, shape); } |
5. 람다는 C++ 새로운 규격이 나올 때 마다 더 좋아지고 있다