티스토리 뷰

람다 함수를 func pointer 처럼 사용하는 방법도 있지만, 람다 함수가 빛을 발하는 방법은 무명 함수를 만들어서 사용하는 것이다.

 

lambda-introducer 안에다가 &를 하나 넣어 놓으면 바깥에 있는 친구들을 reference로 가져올 수 있다.

그 이외에도 =를 넣는다면 복사를 한다. 만일 this를 넣는다면 그 클래스의 this->name을 가져올 수도 있다.

 

그 이외에도 람다 함수는 STL에서도 유용하게 사용할 수 있다.

 for_each(v.begin(), v.end(), [](int val) {cout << val << endl; });

 

보통 이러한 방식으로 많이 사용된다. 

 

 

#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	// func pointer 처럼 사용하는 방법
	auto func = [](const int & i) -> void { cout << "Hello, Wolrd!" << endl; };
	
	func(123);
	
	[](const int & i) -> void { cout << "Hello, Wolrd!" << endl; } (1234);
	
	{
    	// =, this, & 다가능
		string name = "JAckAJack";
		[&]() { std::cout << name << endl; } ();
	}
	
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	
	auto func2 = [](int val) {cout << val << endl;};
	for_each(v.begin(), v.end(), func2);
	
	cout << []() -> int { return 1; } () << endl;
	
	std::function<void(int)> func3 = func2;
	func3(123);
	
	std::function<void()>func4 = std::bind(func3, 456);
	func4();
	
	{
		// 함수 레퍼런스, 클래스 인스턴스, 파라미터 홀더
		Object instance;
        	// 클래스 안에 멤버 펑션을 실행시키는데 실행시키는데 인스턴스가 필요하므로 인스턴스의 포인터를 넣어주는 것이다.
		auto f = std::bind(&object::hello, &instance, std::placeholders::_1);
		
		f(string("world"));
		
		auto f2 = std::bind(&goodbye, std::placeholders::_1);
		
		f2(string("World"));
	}
}

 

Hello, Wolrd!
Hello, Wolrd!
JAckAJack
1
2
1
123
456

 

 

std::function은 일종의 펑션 포인터이다.

 

파라미터를 넣어주어야하는데, 만약 파라미터를 넣어주기 귀찮다면, std::bind를 사용하여 아에 bind 할 수 있다.

 

그렇게 하게 되면 파라미터를 안줘도 이미 std::bind로 묶여 있기 때문에 문제 없이 사용할 수 있다.

 

 

 

std::placeholders 란 파라미터가 여러 개 존재 할때,

 

std::(함수 포인터, 인스턴스 포인터, std::placeholders::_1, std::placeholders::_2, ... ) 이런식으로 사용할 수 있다.

 

#include <iostream>
#include <functional>

int test_func(int a, int b)
{
	return a * b;
}

int main()
{
	auto func1 = std::bind(test_func, 5, std::placeholders::_1);
	
	std::cout << func1(2) << std::endl;
	
	return 0;
}
10

 

placeholder란 한마디로 대체 그릇 같은 존재이다.

 

지금 인자가 2개이고 std::bind로는 1개의 인자 밖에 입력되있지 않다. 하지만 placeholders로 설정되어 있다면, 대체자로써 나중에 따로 입력 받는 것이 가능하다. 위와 같은 상황처럼 말이다.

 

또한,

#include <iostream>
#include <functional>

int test_func(int a, int b)
{
	return a * b;
}

int main()
{
	auto func1 = std::bind(test_func, 5, 2);
	
	std::cout << func1() << std::endl;
	
	return 0;
}

이 코드 또한 위와 같은 결과를 얻을 수 있다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함