[C++] LambdaPROGRAMMING/04. C++2024. 4. 24. 13:33
Table of Contents
반응형
Lambda
람다 함수는 아래와 같이 대괄호[], 소괄호(), 중괄호{}, 소괄호() 이런 모양으로 생겼다.(여기서 생략이 가능한 건 소괄호들)
[] ( ) { } ( )
[캡처] (매개변수) { 함수 동작 } (호출인자)
- 첫 번째 [] : 캡처
- 두 번째 () : 매개변수 선언 부분 (생략 가능 - 매개변수 필요 없을 때)
- 세 번째 {} : 함수 동작 부분
- 네 번째 () : 함수 호출 시 인자 (생략 가능 - 호출 시에만 사용)
람다 캡쳐
람다에서는 [ ] ➡️ 이 대괄호 모양을 캡처라고 한다.
캡처는 람다 외부에 정의되어있는 변수나 상수를 람다 내부에서 사용하기 위해서 사용한다.
캡쳐의 방식
- 참조로 캡처 ➡️ &변수이름
- 복사로 캡처 ➡️ 변수이름
- 모든 외부 변수에 대해 참조 ➡️ [&]
- 모든 외부 변수에 대해 복사➡️ [=]
- 변수가 2개 이상이면 섞어서도 가능 ➡️ [&, 변수이름] (모든 외부 변수는 참조로 사용하지만, 변수이름만 복사로 사용)
람다 본문에 들어올 수 있는 것
- 람다 바깥쪽 범위에서 캡쳐된 변수들
- 파라미터들
- 로컬에서 선언 된 변수
- 멤버 변수도 캡쳐절을 이용할 수 있음
- 정적 스토리지(Data 영역) 기간이 있는 모든 변수(전역 변수)
사용법
[] (매개변수) { // 함수 동작 } (호출 시 인자) ;
[] (int a, int b) { cout << a + b << endl; } (10, 20);
⚠️함수의 이름과 반환형이 보이지 않음⚠️
예제1 : 모든 외부 변수 참조로 캡처
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int a = 5;
int b = 7;
printf("&a = %p, &b = %p\n", &a, &b); // 주소 확인
auto add = [&]() // 모든 외부 변수 참조
{
printf("a = %d, b = %d\n", a, b);
printf("&a = %p, &b = %p\n", &a, &b); // 값 복사여서 주소가 다르다
return a + b;
};
int c = add();
printf("add = %d\n", c);
|
cs |
예제2 : a 참조 / b 복사
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int a = 5;
int b = 7;
printf("&a = %p, &b = %p\n", &a, &b); // 주소 확인
auto add2 = [&a, b]() // a참조, b복사
{
printf("a = %d, b = %d\n", a, b);
printf("&a = %p, &b = %p\n", &a, &b); // 값 복사여서 주소가 다르다
return a + b;
};
int d = add2();
printf("add = %d\n", d);
|
cs |
예제3 : 함수 포인터를 이용한 람다
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include <stdio.h>
#include <thread>
#include <functional>
using namespace std;
class Test_Lambda
{
public:
function<void()> Print()
{
return []()
{
printf("Print\n");
};
}
function<int(int)> GetAdd()
{
member += 10; //멤버변수 캡쳐절 이용
return [=](int value)
{
return value + member;
};
}
function<int(int)> GetAdd2(int val)
{
member += val; //멤버변수 캡쳐절 이용
return [=](int value)
{
return value + member;
};
}
private:
int member = 10;
};
int main()
{
std::thread t([=](int x) // 스레드
{
for (int i = 0; i < x; i++)
printf("%d\n", i);
}, b); // x에 들어갈 값
t.join();
Test_Lambda* lambda = new Test_Lambda();
auto print = lambda->Print();
print();
auto func = lambda->GetAdd();
int e = func(20);
printf("e = %d\n", e);
auto func2 = lambda->GetAdd2(30);
int f = func2(20);
printf("f = %d\n", f);
delete lambda;
return 0;
}
|
cs |
출처 및 참고: 강의 짱잘하시는 울 유니티 선생님 수업
반응형
@HYUNJZZANG :: HyunZzang
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)