>>[C++ 관련 모든 글 보기]
1. lambda는 무엇인가??
1) 정의
- 이름 없는 함수입니다.
2) 형태
(1) 캡처
- Lambda 외부에서 정의한 변수를 Lambda 코드 부분에서 에서 사용하기 위해 선언 부분입니다.
- 선언 방법의 종류는 다음과 같습니다.
a. 복사 캡처 [ = ]
- 모든 변수나 상수를 복사로 캡처하고 현재 lambda객체에서 사용,
- 전역(global) 범위까지가 그 캡처 범위입니다
b. 참조 캡쳐 [ & ]
- 모든 변수나 상수를 참조로 캡처하고 현재 lambda객체에서 사용
- 전역(global) 범위까지가 그 캡처 범위입니다
c. 현재 객체 캡쳐 [ this ]
- 클래스 멤버 함수안에서 정의되는 lambda는 [this]로 현재 객체를 참조로 캡처할 수 있습니다.
d. 아무것도 캡쳐 안 함 [ ]
Ex) 참조 사이트 https://docs.microsoft.com/ko-kr/cpp/cpp/lambda-expressions-in-cpp?view=vs-2019
a. 정상 사용
[&total, factor]
[factor, &total]
[&, factor]
[factor, &]
[=, &total] [&total, =]
b. 잘 못된 사용 법
[&, &i]{}; // ERROR: i preceded by & when & is the default
[=, this]{}; // ERROR: this when = is the default
[i, i]{}; // ERROR: i repeated
(2) 매개 변수
- 일반 함수의 매개 변수
(3) 리터 타입
- 일반 함수의 return type
(4) 코드
- 실행할 코드
(5) 인자
- lamdba 함수에서 전달할 인자
2) 사용법
(1) 매개 변수가 없을 때
[]{}; or [](){};
(2) 매개 변수가 있을 때
[](int a){}:
(3) 매개 변수가 있고 리턴 값이 있을 때
[](int a)->int { return a; }:
(4) 즉시 실행 방법
- Lambda함수 생성 후 마지막에 ()를 사용하여 호출합니다.
[](){}();
2. lambda의 특징
1) 함수를 객체처럼 다룰 수 있습니다.
- lambda를 std::function Class에 대입할 수 있기 때문에 이것을 함수의 입력, 반환 값으로 사용 가능합니다.
* std::function은 C언어의 함수 포인터라고 생각하면 이해가 빠릅니다.
(1) 함수의 입력 값 값으로 사용할 수 있습니다.
std::function에 lambda함수를 담아 다름 함수의 인자로 넘길 수 있습니다.
(2) 함수의 반환 값으로 사용할 수 있습니다.
std::function에 lambda함수를 담아 함수의 반환 값으로 넘길 수 있습니다.
2) 실행 시간에 생성할 수 있습니다.
3. Sampel Code
1) lambda를 객체처럼 사용하는 예제
(1) 함수의 입력 값 값으로 사용할 수 있습니다.
- 다음 코드에서 lambda 함수를 myid란 객체에 담아 WhatIsYourId의 id의 인자로 사용하였습니다.
#include <iostream>
#include <functional>
using namespace std;
void WhatIsYourId(function<string ()> id) {
cout<<"MY Id is "<< id();
}
int main() {
function<string ()> myid = [](){
return "chun4foryhou";
};
WhatIsYourId(myid);
return 0;
}
(2) 함수의 반환 값으로 사용할 수 있습니다.
- 다음 코드에서 중요한 것은 GetLambdaFunc의 return 이 Lambda 함수라는 것이 중요합니다.
#include <iostream>
#include <functional>
using namespace std;
function<void ()> GetLambdaFunc(int cmd) {
switch (cmd) {
case 1:
return [](){
cout<<"Cmd 1"<<endl;
};
break;
case 2:
return [](){
cout<<"Cmd 2"<<endl;
};
break;
}
}
int main() {
function<void ()> getlambda;
getlambda = GetLambdaFunc(2);
getlambda();
return 0;
}
2) 실행 시간에 함수를 생성하여 바로 사용하는 예제
#include <iostream>
int main() {
int a = 1;
int b = 2;
std::cout<<[a, &b](int c, int d)->int {
return a+b+c+d;
} (3, 4)<<std::cout;
return 0;
}
4. lambda의 mutable 이란 ?
[캡처절] (매개변수) mutable -> 반환형식 { 함수내용 }
1. [캡쳐절]은 외부 변수를 가져다 쓸 수 있는 공간이고,
2. (매개변수)는 말 그대로 함수 선언시 필요한 매개 변수이다.
3. mutable 은 함수 내에서 외부 변수를 수정할 수 있게 해 주는 옵션
4. 반환형식 : 함수 리턴 형식
5. {함수 내용}
5. lambda는 언제 쓰면 좋은 것일까?
아직 까지는 C++어린이라 잘 모르겠다.. 누가 뎃글좀..
>>[C++ 관련 모든 글 보기]
'ProgrammingLang > c++' 카테고리의 다른 글
[C++ 개발자되기] 6. istringstream, ostringstream, stringstream 사용법 (4) | 2019.07.24 |
---|---|
[C++ 개발자되기] 5. bind 사용법 (0) | 2019.07.23 |
[C++ 개발자되기] 3. C++에서 Thread 사용법 (추가 정리 필요) (2) | 2019.07.18 |
[C++ 개발자되기] 2. C++ Class의 필요성과 사용법 (0) | 2019.07.18 |
[C++ 개발자되기] 1. C에는 없고 C++만 있는 것 (2) | 2019.07.17 |