IT

boost :: function 및 boost :: bind 작동 방법

lottoking 2020. 9. 25. 08:16
반응형

boost :: function 및 boost :: bind 작동 방법


나는 내 코드 전체에 마법 상자가 흩어져있는 것을 싫어합니다. boost::bind

(즉, 멤버 메서드는 __thiscallVC하에 "일반"함수는 일반적으로 __cdecl또는 __stdcallC와 호환되는 함수를 위한 것입니다.


boost::function무엇이든 할 수 operator()있는 권리 서명이 매개 변수로 구속하고, 당신의 바인딩의 결과는 매개 변수를 호출 할 수 int있는가에 바인딩 할 수 있도록 function<void(int)>.

이것이 작동하는 방식입니다 (이 설명은에도 동일하게 적용됩니다 std::function).

boost::bind(&klass::member, instance, 0, _1) 다음과 같은 객체를 반환합니다.

struct unspecified_type
{
  ... some members ...
  return_type operator()(int i) const { return instance->*&klass::member(0, i);
}

어디 return_typeint의 서명에서 추론 klass::member하고, 함수 포인터와 바인딩 매개 변수는 실제로 객체에 저장됩니다 ,하지만 그건 중요하지 않아

이제 boost::function어떤 유형의 검사도 수행하지 않습니다. 템플릿 매개 변수에 제공되는 모든 개체와 서명을 가져옵니다. 서명에 따라 호출 할 수있는 개체를 생성 개체를 호출합니다. 불가능하다면 오류입니다.

boost::function 실제로 다음과 같은 객체입니다.

template <class Sig>
class function
{
  function_impl<Sig>* f;
public:
  return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};

여기서 return_type과은으로부터 argument_type추출 Sig하고, f동적 힙에 할당된다. 크기가 완전히 달라짐이없는 객체를 boost::function.

function_impl 추상 클래스입니다

template <class Sig>
class function_impl
{
public:
  virtual return_type operator()(argument_type arg0) const=0;
};

모든 작업을 수행하는 클래스는 boost::function. 할당 한 각 유형의 개체에 대해 하나씩 있습니다.boost::function

template <class Sig, class Object>
class function_impl_concrete : public function_impl<Sig>
{
  Object o
public:
  virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); }
};

즉, 귀하의 경우 기능을 향상시키는 할당 :

  1. (물론 유형을 인스턴스화합니다 function_impl_concrete<void(int), unspecified_type>)
  2. 힙에 해당 유형의 새 개체를 만듭니다.
  3. 이 멤버를 boost :: function의 f 멤버에 할당합니다.

함수 호출을 호출하면 해당 구현 함수의 가상 함수를 호출하여 원래의 호출을 지시합니다.

면책 조항 :이 설명의 이름은 의도적으로 구성되었습니다. 실제 인물이나 등장 인물과 닮은 점은 모두 알고 있습니다. 목적은 원칙을 설명하는 것이 었습니다.

참고 URL : https://stackoverflow.com/questions/527413/how-boostfunction-and-boostbind-work

반응형