반응형
1. 클로저(C++예시)
2. 람다 expression(C++11 부터)
람다 표현식이란?
이름이 없는 함수 객체를 만드는 방법
람다 표현식과 Functor(함수 객체)의 어셈블리 코드는 동일함
형식
- auto lambda = [localv=3](int a){
return a + localv;
} - 캡쳐 : [] 안에 들어가는 부분
- auto lambda = [localv=3](int a){
class Plus{
public:
explicit Plus(int a) : localVar{a} {}
int operator() (int x) const{
return localVar + x;
}
private:
int localVar;
}
int main(){
auto lambdaPlus3 = [localVar=3](int x){
return localVar + x;
}
Plus plus3{3};
std::cout << plus3(10) << std::endl;
std::cout << lambdaPlus3(10) << std::endl;
// 위의 결과 및 어셈블리 코드는 동일함
}
3. 캡쳐
- 값에 의한 캡쳐
- [localv] 또는 [=]
- 함수 객체의 멤버 변수와 같은 역할
- [localv] : 위에서 localv 변수를 찾아 람다 내부에서 사용
- [=] 만 쓰면 람대 내부에 사용된 변수를 위에서 찾아 자동으로 값에 의한 캡쳐를 함
int three{3};
auto lambdaPlus3 = [=](int x){
return x + three;
// 위에서 three를 찾아 값에 의한 캡쳐를 함
};
참조에 의한 캡쳐
- 함수 객체의 참조 멤버 변수와 같은 역할
- 전달하는 객체가 큰 경우 사용
- [&] 만 쓸 경우 람대 내부에 사용된 변수를 위에서 찾아 자동으로 참조에 의한 캡쳐를 함
this에 의한 캡쳐
- [this]
- 멤버 변수와 함수를 람대 내부에서 사용 가능함!
class Cat{
public:
explicit Cat(int age) : mAge{age} {}
void speak() const {}
void test() const {
auto lambda = [this](){
this->mAge;
this->speak();
}
lambda();
}
private:
int mAge;
int main(){
Cat kitty(3);
kitty.test();
}
4. 람다 표현식 + STL 함수 사용 예제
vector<int> nums{1,2,3,4,5,6,7,8,9,10};
auto lambdaAdd10 = [](int &n){
n += 10;
}
for_each(nums.begin(), nums.end(), lambdaAdd10);
// nums 의 인자에 모두 10을 더함
// nums = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
5. 고차원 함수란
- 함수를 인자로 받음
- 함수를 리턴함
6. 함수형 프로그래밍
- 함수를 변수나 객체처럼 다룰 수 있다.
- std::function 사용 시
- 함수형 포인터, functor, 람다식 모두 가능함
void freeFunc(int num){
cout << num;
};
void runFunction(
int num,
const std::function<void(int)>& fn){
//function 사용
fn(i);
}
int main(){
// 1. 함수 포인터 전달
void (*fnPtr)(int) = freeFunc;
runFunction(10, fnPtr);
// 2. 함수 객체 전달
FunctionObj funcObj;
runcFunction(10, funcObj);
// 3. 람다식 전달
auto lambdaFn = [](int num){
cout << num;
};
runFunction(10, lambdaFn);
}
참고
반응형
'C++ > C++' 카테고리의 다른 글
[C++]병렬 프로그래밍 (0) | 2021.03.11 |
---|---|
[C++]스마트 포인터 (0) | 2021.03.09 |
[C++]LR value 및 최적화 (0) | 2021.03.09 |
[C++]빌드 프로세스 (0) | 2021.03.09 |
[C++]메모리 구조 (0) | 2021.03.09 |