ProgrammingLang/c++

[C++ 개발자되기] 5. bind 사용법

jinkwon.kim 2019. 7. 23. 15:24
728x90
반응형

>>[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++ 관련 모든 글 보기]

728x90
반응형