boost::function
은 operator()
올바른 서명을 매개 변수로 바인딩하고 바인드 결과를 int
매개 변수로 호출 할 수 있으므로 function<void(int)>
에 바인딩 할 수 있습니다.
이 작동하는 방법이다 (이 설명은 std::function
에 대해 모두 적용) :
boost::bind(&klass::member, instance, 0, _1)
가 return_type
및 int
이 klass::member
의 서명에서 추론이
struct unspecified_type
{
... some members ...
return_type operator()(int i) const { return instance->*&klass::member(0, i);
}
같은 객체를 반환하고, 함수 포인터와 바운드 매개 변수는 실제로 개체에 저장되지만 중요하지는 않습니다.
이제 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
에서 파생 된 구체적인 클래스입니다.
- 가 (물론, 그 시간을 컴파일의) 유형
function_impl_concrete<void(int), unspecified_type>
를 인스턴스화 : 당신이 당신의 경우에 의미 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); }
};
에 할당 할 각 개체 유형에 대한 하나가, 할당 기능을 강화하기 위해
- :: 함수는 부스트 F 부재이 객체를 할당 힙
- 해당 유형의 새로운 객체를 생성
함수 개체를 호출하면 구현 개체의 가상 함수가 호출되어 원래 함수로 호출됩니다.
면책 조항 :이 설명의 이름은 의도적으로 작성된 것입니다. 진짜 사람이나 등장 인물과 닮았습니다 ... 당신도 알고 있습니다. 목적은 원리를 설명하기위한 것이 었습니다.
위보기 : http://stackoverflow.com/questions/112738/how-does-boost-bind-work-behind-the-scenes-in-general –
사실이 질문은 바인딩과 기능에 관한 것입니다. –
예 따라서 여전히 바인딩 할 수있는 방법에 대한 질문을 떠난다. void MyClass : DoSomething (std :: string str, int number) boost :: function bind (& MyClass :: DoSomething, instance, "Hello World", _1) –