람다 표현식
[ 캡쳐 블록 ] ( 파라미터 목록 ) mutable exception 목록 속성 지정 -> 리턴 타입 { 함수 몸체 }
기본적인 람다 표현식
1 2 3 4 5 | auto basic_lambda = [] { std::cout << "lambda" << std::endl; }; lambda(); |
파라미터를 받는 람다 표현식
1 2 | auto params_lambda = [](int p) { std::cout << "p is " << p << endl; }; params_lambda(2); | cs |
리턴값을 가지는 람다 표현식
1 2 | auto return_lambda = [](int a, int b) -> int { return a + b; }; int sum = return_lambda(1, 2); | cs |
리턴 타입을 생략한 람다 표현식
1 2 | auto return_lambda = [](int a, int b) { return a + b; }; int sum = return_lambda(1, 2); | cs |
변수 캡쳐
1 2 3 4 5 6 | int a = 2; auto capture_lambda = [a]() mutable { a += 2; std::cout << "a = " << a << std::endl; }; | cs |
[=] 모든 변수를 value로 캡쳐
[&] 모든 변수를 ref로 캡쳐
[this] 주변 스코프가 어떤 객체의 블록 내부라면 그 객체를 캡쳐한다.
이렇게 캡쳐하면 람다 표현식 안에서 이 객체에 접근이 가능하며 this->를 사용하지 않아도 된다.
리턴 타입으로서의 람다 표현식
STL은 함수 객체의 래퍼 클래스 std::function을 제공. 함수 포인터와 비슷한 역할을 하고 템플릿을 통해 다형성 지원.
파라미터와 리턴 타입만 일치하면 함수 객체, 멤버 메서드의 포인터, 함수 포인터, 람다 표현식 모두 감쌀 수 있음.
리턴 타입으로 double, 파라미터로 두 개의 int를 가지는 함수 래퍼
1 | std::function<double(int, int)> wrapper; | cs |
std::function을 사용해 람다 표현식에 이름 부여 및 함수에서 리턴 가능
1 2 3 4 | std::function<int(void)> AdderLambda(int a) { return [a] { return a + 2; }; } | cs |
함수 바디에서 인자 x를 값으로 캡쳐하고 그 값에 2를 더하고 int 타입으로 리턴하는 람다 표현식을 생성하여 리턴.
함수의 리턴 타입은 std::function<int(void)>로, 인자가 없고 리턴 타입이 int 인 함수.
바디에 있는 람다 표현식은 리턴 타입과 완전 일치.
변수 x는 값으로 캡쳐되었기 때문에 람다 표현식이 함수에서 리턴되기 직전의 값이 복제되어 적용.
c++14에서는 함수 리턴 타입에 대한 연역이 지원되어 아래와 같이 사용 가능
1 2 3 4 5 6 7 8 9 10 | auto AdderLambda(int a) { return [a] { return a + 2; }; } std::function<int(void)> fn = AdderLambda(2); std::cout << fn() << std::endl; auto fn = AdderLambda(2); std::cout << fn() << std::endl; | cs |
* [전문가를 위한 c++11] 을 참고하였습니다.