boost :: function和boost :: bind是如何工作的

我不喜欢把魔术盒分散在我的代码中……这两个类如何工作,基本上允许任何函数映射到一个函数对象,即使函数<>具有完全不同的参数boost::bind

它甚至适用于不同的调用约定(即成员方法是VC下的__thiscall ,但对于那些需要与C兼容的“普通”函数通常是__cdecl__stdcall

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不会进行任何types检查:它将采用您在其模板参数中提供的任何对象和任何签名,并根据您的签名创build可调用的对象并调用该对象。 如果这是不可能的,这是一个编译错误。

boost::function实际上是这样一个对象:

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

其中return_typeargument_type是从Sig中提取的,而f是在堆上dynamic分配的。 这需要允许完全不相关的不同大小的对象绑定到boost::function

function_impl只是一个抽象类

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

完成所有工作的类是从boost::function派生的具体类。 对于您分配给boost::function每种types的对象,都有一个

 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); } }; 

这意味着在你的情况下,分配升压function:

  1. 实例化一个typesfunction_impl_concrete<void(int), unspecified_type> (当然是编译时)
  2. 在堆上创build该types的新对象
  3. 把这个对象赋给boost :: function的f成员

当你调用函数对象的时候,它会调用它的实现对象的虚函数,这个函数会把调用引导到你原来的函数中。

免责声明:请注意,这个解释中的名字是故意弥补的。 任何与真人或人物相似的东西……你知道的。 目的是说明原则。