본문 바로가기
C++ 200제/코딩 IT 정보

C++11 람다(Lambda) 함수란? template, struct 익명함수 예제 소스

by vicddory 2019. 3. 7.
반응형

C++11 람다(Lambda) 함수란? template, struct 익명함수 예제 소스


C++11은 함수 내부에 함수 객체를 선언하여 사용 할 수 있습니다. 주로 사용하는 일반적인 방법은 아래와 같습니다. (람다 사용 간단한 예제)


1
2
3
4
5
6
7
8
9
void func_test ()
{
  auto func_obj = [] (int a) 
  {
    return a + 100;
  };
 
  func_obj (23);
}
cs


함수나 각종 수식에 인라인을 이용해 실체를 선언할 수 있습니다. 실행 코드와 함께 데이터 영역도 겸비하게 되는 것입니다.


1
2
3
4
5
6
7
8
9
10
11
void func ()
{
  struct LocalFuncT {
     int operator () (int a) {
       return a + 100;
     }
  };
  LocalFuncT func_obj = LocalFuncT ();
 
  func_obj (23);
}
cs


그렇지만, 함수 내에서 선언된 class와 그 객체는 template을 이용할 수 없는 등 제한이 있습니다. 그래서 C++ 11에도 람다(Lambda)가 도입되었습니다.


C++ 람다 함수 예제[C++ 강좌 최신 문법 예제, Template struct]





C++ 11에서는 람다 Lamda 함수로 쉽게 선언하고 사용할 수 있도록 지원이 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
template <typename FT>
struct CallbackObject {
  FT Func;
  CallbackObject (FT func) : Func (func)
  {
  }
  int operator () (int a)
  {
    return Func (a);
  }
};
 
template <typename T>
CallbackObject <T> CreateCallback (FT func)
{
  return CallbackObject <FT> (func);
}
 
int s_func (int a)
{
  return a + 200;
}
 
struct FuncObject {
  int operator () (int a)
  {
     returtn a + 300;
  }
};
 
void func_test ()
{
  CreateCallback (s_func) (12); / / pointer
  CreateCallback (FuncObject ()) (12); / / object
  CreateCallback ([] (int a) {return a + 100;}) (12); / / lambda
}
cs


함수의 객체를 사용하던 부분을 람다 Lambda 함수로 대체합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
template <typename TT, typename FT>
struct CallbackObject {
  TT * This;
  FT Func;
  CallbackObject (TT * t, FT func) : This (t), Func (func) {}
  int operator () (int a)
  {
    return (This-> * Func) (a);
  }
};
template <typename TT, typename FT>
CallbackObject <TT,FT> CreateCallback (TT * t, FT func)
{
  return CallbackObject <TT,FT> (t, func);
}
 
struct func_class {
  void func_test ()
  {
    auto func_obj2 = [=] (int a) {dump (this); return a + 400;};
 
    func_obj2 (12);
 
    func_obj2.operator () (12);
 
    typedef decltype (func_obj2) FUNC_T2;
    CreateCallback (&​​ func_obj2, & FUNC_T2 :: operator ()) (12);
  }
};
cs


C++11 람다(Lambda) 함수란? template, struct 익명함수 예제 소스

반응형