首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >boost::function和boost::bind的工作原理

boost::function和boost::bind的工作原理
EN

Stack Overflow用户
提问于 2009-02-09 08:28:45
回答 1查看 63.2K关注 0票数 84

我不喜欢让魔盒散落在我的函数上,这两个类基本上允许任何函数映射到code...how对象,即使function<>有一个与传递给boost::bind的im完全不同的参数。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-02-09 12:40:47

boost::function允许将任何具有正确签名的operator()绑定为参数,并且可以使用参数int调用绑定结果,因此可以将其绑定到function<void(int)>

这就是它的工作方式(这一描述同样适用于std::function):

boost::bind(&klass::member, instance, 0, _1)返回如下所示的对象

代码语言:javascript
复制
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实际上是一个如下所示的对象:

代码语言:javascript
复制
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是在堆上动态分配的。这是允许不同大小的完全不相关的对象绑定到boost::function所必需的。

function_impl只是一个抽象类

代码语言:javascript
复制
template <class Sig>
class function_impl
{
public:
  virtual return_type operator()(argument_type arg0) const=0;
};

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

代码语言:javascript
复制
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); }
};

这意味着在您的示例中,对boost函数的赋值:

在堆上创建一个该类型的新对象时,如果

  1. instantiates a type course)
  2. creates (即编译时),
  3. 会将该对象赋给boost::function

的f成员

当您调用function对象时,它将调用其实现对象的虚函数,该虚函数将直接调用您的原始函数。

免责声明:请注意,此解释中的名称是故意编造的。任何与真实人物或人物的相似之处。你知道的。目的是为了说明这些原则。

票数 97
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/527413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档