[C++] 간단한 객체 함수를 구현할때 람다식의 사용
람다식(Lambda Expressions)
C++에서 람다식은 간단한 함수를 정의할때 사용되는데, 람다식을 사용하여 함수 객체를 생성하고, 간단한 로직을 인라인으로 작성할 수 있다.
주로 STL이나 다른 함수에서 함수를 인자로 넘길때 많이 사용된다.
//[capture](parameters) -> return_type { // function body }
[&](int a){ return a<x; }
표기를 람다식이라 부른다.
capture
[&]는 캡처 리스트로, 람다 함수가 외부 변수를 참조하다는 뜻이다.
[&x]는 x만 참조하겠다는 뜻이다.
[x]는 x 값을 복사해서 람다 내부로 전달하겠다는 뜻이다.
[] 무엇도 캡쳐하지 않겠다는 뜻. 외부 변수를 사용하지 않는다.
[=] 모든 지역명을 캡쳐하겠다는 뜻. 모든 외부 변수를 값으로 복사해서 사용.
[this] 현재 클래스의 멤버 변수와 멤버 함수를 캡쳐한다는 뜻. (현재 클래스의 복사본은 this*를 캡쳐한다!)
parameters, return function
()은 파라미터 즉 람다 함수의 매개변수를 명시한다. 이후 캡처 리스트와 매개 변수로 함수 내용을 실행시켜 리턴한다. 예시를 보자
...
void printNumber(){
// 람다식을 활용해 정수 벡터를 출력하는 예시
std::vector<int> nums = {1,2,3}; // 정수 벡터
std::for_each(nums.begin(), numbers.end(), [](int num) {
std::cout << "숫자: " << num << std::endl;
});
}
이 예제에서는 캡처 리스트를 사용하지 않았다.
그럼 다음은 외부 변수를 캡처하는 예제를 보자.
...
void printNumber(){
// 람다식을 활용해 정수 벡터를 출력하는 예시
int multi = 2; // **외부변수
std::vector<int> nums = {1,2,3}; // 정수 벡터
std::for_each(nums.begin(), numbers.end(), [multi](int num) {
std::cout << "곱 숫자" << num * multi << std::endl; // 외부 변수 활용
});
}
위와 같이 외부 변수를 캡처하여 내부 변수로 사용하고 있다! 그리하여 캡처한 변수들을 캡처 리스트라고 하는것
참고
⌜비야네 스트롭스트룹⌟, "A Toor Of C++",에이콘