◆람다함수
▷람다 함수는 익명 함수라고 불리고 함수를 변수처럼 취급하기 위한 테크닉으로 주로 쓰인다.
◆#include <functional>
▷이 헤더가 없어도 람다는 사용할 수 있지만 편리한 std::function을 사용하기 위해 작성합니다.
◆lambda 함수의 구조
▷[캡쳐](파라미터)->리턴형식{ ... }
▷캡쳐는 =을 사용하기로 합니다. (전체 레퍼런스 캡쳐)
//foo 뒤의 부분이 람다함수이다.
std::function<void()> foo = [=]() {
printf("Hellow world");
};
◆std::function<T>
▷람다함수는 std::function을 통해 변수처럼 선언할 수 있습니다.
▷함수의 반환값과 파라미터를 T 부분에 <int(int,int)> 와 같이 작성합니다.
std::function<int(int,int)> sum = [=](int value1, int value2) {
return value1 + value2;
};
//std::function을 auto로 줄일 수 있다.
auto sum = [=](int value1, int value2) {
return value1 + value2;
};
sum(10,20);
◆std::bind
▷기존에 존재하는 함수를 std::function 형태의 클래스 인스턴스로 지정할 수 있게 됩니다.
▷파라미터가 있을 경우 td::placeholders::_1 를 수에 맞게 써주어야합니다.
#include <cstdio>
#include <functional>
#include <string>
int sum(int a, int b) {
return a + b;
}
int main() {
//파라미터가 있을 경우 td::placeholders::_1 를 수에 맞게 써주어야함
auto local_sum = std::bind(sum,std::placeholders::_1, std::placeholders::_2);
int result = local_sum(10, 20);
printf("result: %d", result);
}
▷단, 클래스 내무에서는 클래스 정의 앞에 앰퍼센드(&)를 붙여야 하며 인스턴스도 std::bind의 파라미터로 넘겨주어야 합니다.
Tank* tank = new Tank();
auto attack = std::bind(&Tank::attackTo, tank, std::placeholders::_1);
attack("Dragon";
'C++ > C++' 카테고리의 다른 글
5장 반복문과 cin 메모 (0) | 2023.07.01 |
---|---|
4장 포인터, 배열, 포인터 연산 메모 (0) | 2023.06.26 |
[C++] 파일 입출력 (0) | 2023.02.16 |
[C++] STL 자료구조 (0) | 2023.02.16 |
[C++] STL 핵심, Generic (0) | 2023.02.16 |