c++ - boost bind 예제



boost:: function 및 boost:: bind 작업 방법 (1)

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_typeintklass::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_typeargument_typeSig 에서 추출되고 f 는 힙에 동적으로 할당됩니다. 크기가 다른 완전히 관련없는 객체가 boost::function 바인딩되도록하려면이 방법이 필요 boost::function .

function_impl 은 단지 추상 클래스이다.

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

모든 작업을 수행하는 클래스는 boost::function 에서 파생 된 구체적인 클래스입니다. 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 멤버에 할당합니다.

함수 객체를 호출하면 구현 객체의 가상 함수가 호출되어 원래 함수로 호출됩니다.

면책 조항 :이 설명의 이름은 의도적으로 작성된 것입니다. 진짜 사람이나 등장 인물과 닮았습니다 ... 당신도 알고 있습니다. 목적은 원리를 설명하기위한 것이 었습니다.

필자는 코드 전체에 마법 상자가 흩어져있는 것을 좋아하지 않습니다 ...이 두 클래스가 함수 <>에 전달되는 매개 변수가 완전히 다른 경우에도 기본적으로 모든 함수를 함수 개체에 매핑 할 수 있도록하려면 어떻게해야할까요? boost::bind

그것은 다른 호출 규칙 (즉, 멤버 메서드는 VC 아래에서 __thiscall 있지만, "정상적인"함수는 일반적으로 __cdecl 또는 C와 호환되어야하는 __stdcall 있습니다.





boost-function