본문 바로가기

Programming/C & C++

[c++11/14]Lambda

람다 표현식

[ 캡쳐 블록 ] ( 파라미터 목록 ) mutable exception 목록 속성 지정 -> 리턴 타입 { 함수 몸체 }


기본적인 람다 표현식

1
2
3
4
5
auto basic_lambda = [] 
{
    std::cout << "lambda" << std::endl;
};
 
lambda();

cs



파라미터를 받는 람다 표현식

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(12);
cs


리턴 타입을 생략한 람다 표현식

1
2
auto return_lambda = [](int a, int b) 
return a + b; 
};
int sum = return_lambda(12);
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(intint)> 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] 을 참고하였습니다.