본문 바로가기

C++

[C++] 람다

람다는 함수 객체를 빠르게 만드는 문법이다.

람다는 [](매개변수){함수 본체} 의 형식으로 이루어져있다.

반환타입이 없는데 auto와 같이 자동으로 반환타입을 추론한다.

[](매개변수)->반환타입{함수본체}의 형식으로 반환타입을 정할 수도 있다. 

 

auto LambObj = [=](Item& item){return Item.id==itemId}; //클로져

 

위와 같이 람다로 만든 객체를 클로져라고 한다. 

그런데 본체 부분에서 itemId는 어디서 불러오는 것일까?

함수 객체에서는 변수를 만들어 저장하지만 람다에서는 다른 곳에 있는 변수를 가져와 저장할 수 있다. 

가져오는 방식에 따라 복사면 []괄호안에 =, 참조면 &을 쓴다. 이것을 캡쳐 모드라고 한다. 

그래서 위 예제에서 복사를 사용하면 람다 생성 시점의 itemId 값, 참조를 사용하면 람다 사용 시점의 itemId값을 이용한다.

 

auto LambObj = [&itemId,rarity,type](Item& item)
{
	return Item.id==itemId&& Item.rarity==rarity&& Item.type==type;
};
auto LambObj = [=,&itemId](Item& item)
{
	return Item.id==itemId&& Item.rarity==rarity&& Item.type==type;
};

 

캡쳐 모드는 각 변수마다 설정할 수 있으며 C++에서는 각 변수마다 설정할 것을 권고하고 있다.

변수를 복사하느냐 참조하느냐에 따라 메모리 오류가 발생할 수 있기 때문이다. 

따로 &를 붙이지 않으면 복사로 처리되고 두번째 코드처럼 기본을 복사로 하고 특정 변수만 참조로 지정할 수도 있다.