반응형
반응형

1. 클로저(C++예시)

2. 람다 expression(C++11 부터)

  1. 람다 표현식이란?

    • 이름이 없는 함수 객체를 만드는 방법

    • 람다 표현식과 Functor(함수 객체)의 어셈블리 코드는 동일함

  2. 형식

    • auto lambda = [localv=3](int a){
      return a + localv;
      }
    • 캡쳐 : [] 안에 들어가는 부분
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. 캡쳐

  1. 값에 의한 캡쳐
    • [localv] 또는 [=]
    • 함수 객체의 멤버 변수와 같은 역할
    • [localv] : 위에서 localv 변수를 찾아 람다 내부에서 사용
    • [=] 만 쓰면 람대 내부에 사용된 변수를 위에서 찾아 자동으로 값에 의한 캡쳐를 함
int three{3};
auto lambdaPlus3 = [=](int x){
   return x + three;
// 위에서 three를 찾아 값에 의한 캡쳐를 함
};
  1. 참조에 의한 캡쳐

    • 함수 객체의 참조 멤버 변수와 같은 역할
    • 전달하는 객체가 큰 경우 사용
    • [&] 만 쓸 경우 람대 내부에 사용된 변수를 위에서 찾아 자동으로 참조에 의한 캡쳐를 함
  2. 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. 고차원 함수란

  1. 함수를 인자로 받음
  2. 함수를 리턴함

6. 함수형 프로그래밍

  1. 함수를 변수나 객체처럼 다룰 수 있다.
  2. 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

+ Recent posts

반응형