[CPP] Boost - bind

윤동환·2023년 6월 8일
0

CPP

목록 보기
2/4
post-thumbnail

bind란?

boost::bind는 기본적으로 여러개의 인수를 갖고 있는 호출 가능한 C++ 객체(함수, 함수자-operator()를 구현한 struct혹은 class)의 인수들을 고정시키는 역할을 합니다.

//간단한 예제

int x_minus_y(int x, int y)
{
    return x-y;
}
// same as x_minus_y(x,3);

boost::function< void ( int ) > func; 
func = boost::bind(x_minus_y, _1, 3);

함수의 2번째 인자의 y에 들어가는 값에 3을 고정하여 넘겨주게됩니다.

만약 5 - 3을 하고 싶다면
ex) x_minus_y(5,3)
func(5)와 같은 결과를 얻을 수 있습니다.

자리표

_1로 표시한 부분이 bind에 의해 생성된 함수자가 받을 인수를 의미하며 _n은 n번째 인수가 됩니다.

멤버함수와 bind

멤버함수를 포인터로 받아서 사용하기 위해선 boost::mem_fn이라는 라이브러리에 대한 이해가 필요합니다.

a_somework_functor = boost::mem_fn(&A::SomeWork);
A a_instance;
// same as a_instance.SomeWork(1,2,3);
a_somework_functor(a_instance, 1, 2, 3);

boost::bind가 사용자의 편의성을 고려해주지 않았다면 boost::bind(&A::Start, _1) 대신 boost::bind(boost::mem_fn(&A::Start), _1)을 사용했어야 할 것입니다.
하지만, 영리한 boost::bind는 첫번째 인수로 멤버함수가 올 경우 알아서 boost::mem_fn을 이용해 처리를 해주기 때문에 편리합니다.

멤버함수를 호출할 땐 암묵적으로 해당 인스턴스의 주소값을 알기위해 this가 첫번째 인자로 넘어갑니다. 덕분에 멤버함수 내에서 객체의 멤버 변수에 접근할 수 있습니다.

profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글