>>[C++ 관련 모든 글 보기]
1. bind란 무엇인가??
함수의 일부 매개 변수를 고정 값으로 세팅한 후, 한번 Wrapping 하여 사용할 수 있게 해주는 함수입니다.
2. 표준 시기
C++ 11에서 표준으로 채택
3. 사용 방법
bind를 할당하는 변수의 자료형에 따라 2가지 형태로 사용 가능 합니다
function 클래스를 사용하는 방법과 auto 키워드를 사용하는 방법
1) function Class를 사용(불편)
std::function<wrapping할 함수의 형태> 변수명 = bind(함수명, 인자1, 인자 2,...);
-> 함수명을 변수명에 연결시킵니다.
2) auito 키워드 사용(편리)
auto 변수명 = bind(함수명, 인자 1, 인자 2,...);
-> 함수명을 변수명에 연결시킵니다..
물론 둘 다 사용 결과는 동일합니다. 그러나 편의상 auto 키워드를 많이 사용합니다.
Ex) function과 auto를 사용한 예제
#include <iostream>
#include <functional>
using namespace std;
int test(string name, int a, int b) {
cout<<name<<" "<<a*b<<endl;
return a*b;
}
int main() {
function<int ()> f = bind(test, "hello", 1, 2);
auto g = bind(test, "hello", 1, 2);
f(); // function 사용
g(); // auto를 사용
}
4. bind시 인자를 변수로 변경하는 방법
위 3번에서 bind 함수 호출 시 test 함수에 넘기는 인자 1, 인자 2, 인자 3에 대하여 고정 값 "hello", 1, 2로 하였습니다. 그러나 진정한 함수는 입력받는 인자 값을 변경할 수 있어야 합니다.
그래서 bind함수 호출 시 고정 값 인자 대신 std::placeholders::_1을 사용하면 wrapping 한 함수(f())에 인자 값을 사용자가 입력 수 있습니다.
std::placeholders::_1는 wrapping 하는 함수의 첫 번째 인자를 가리킵니다.
std::placeholders::_2는 wrapping 하는 함수의 두 번째 인자를 가리킵니다.
Ex) placeholder::_1을 사용한 인자 값 변경 하기
#include <iostream>
#include <functional>
using namespace std;
int test(string name, int a, int b) {
cout<<name<<" "<<a*b<<endl;
return a*b;
}
int main() {
std::function<int ()> f = bind(test, "hello", std::placeholders::_1, 2);
auto g = bind(test, "hello", placeholders_1, 2);
f(1); // function 사용
g(2; // auto를 사용
}
5. placeholders 사용 시 주의 사항
만약 여러분이 std::placeholders::_1을 사용시 _1을 건너뛰고 _2를 사용했다면
auto g = bind(test, "hello", std::placeholders::_2, 2);
g() 함수 호출 시 무조건 2개의 인자를 넘겨야 합니다. g(1, 2) 이렇게 인자 2개를 넘기지 않으면 2번째 인자를 찾지 못하여 컴파일 시 에러 납니다.
>>[C++ 관련 모든 글 보기]
'ProgrammingLang > c++' 카테고리의 다른 글
[C++ 개발자되기] 8. binary file read 및 write (3) | 2019.09.09 |
---|---|
[C++ 개발자되기] 6. istringstream, ostringstream, stringstream 사용법 (4) | 2019.07.24 |
[C++ 개발자되기] 4. lambda 사용법 (0) | 2019.07.19 |
[C++ 개발자되기] 3. C++에서 Thread 사용법 (추가 정리 필요) (2) | 2019.07.18 |
[C++ 개발자되기] 2. C++ Class의 필요성과 사용법 (0) | 2019.07.18 |