C++/C++

[C++] 람다 함수

메카인 2023. 2. 17. 14:43

◆람다함수

▷람다 함수는 익명 함수라고 불리고 함수를 변수처럼 취급하기 위한 테크닉으로 주로 쓰인다.

 

◆#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";