티스토리 뷰
람다 함수를 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;
}
이 코드 또한 위와 같은 결과를 얻을 수 있다.
'언어 > C++' 카테고리의 다른 글
19.3 std::thread와 멀티쓰레딩 기초 (0) | 2020.05.28 |
---|---|
19.2 C++17 함수에서 여러 개의 리턴값 반환하기 (0) | 2020.05.28 |
18.3 문자열 스트림 (0) | 2020.05.26 |
18.2 ostream으로 출력하기 (0) | 2020.05.25 |
18.1 istream으로 입력 받기 (0) | 2020.05.25 |
- Total
- Today
- Yesterday
- codeit
- 자료구조
- 구조체
- call by reference
- 다차원 배열
- inflearn
- 종류
- 3차원 배열
- 강의
- Algorithm
- 프로그래밍
- 비트필드
- timecomplexity
- 공부
- 회전리스트
- 형승격
- 포인터
- 시간복잡도
- 간접 지정
- 알고리즘
- 1차원 배열
- 직접 지정
- 공간복잡도
- 재귀함수
- 공용체
- 배열
- 2차원 배열
- call by value
- C
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |