当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《boost::function和boost::bind如何工作》经验,为你挑选了1个好方法。

我不喜欢在我的代码中散布着魔术盒......这两个类究竟是如何工作的,基本上允许任何函数映射到一个函数对象,即使函数<>有一个完全不同的参数设置为一个im传递给 boost::bind

它甚至适用于不同的调用约定(即成员方法__thiscall在VC下,但"普通"函数通常__cdecl或者__stdcall需要与C兼容的那些).



1> jpalecek..:

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

这是它的工作原理(此描述同样适用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 function
{
  function_impl* f;
public:
  return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};

其中return_typeargument_type从提取的Sig,并f在堆是动态分配的.这需要允许具有不同大小的完全不相关的对象绑定boost::function.

function_impl 只是一个抽象的类

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

完成所有工作的类是派生自的具体类boost::function.您指定的每种类型的对象都有一个boost::function

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

这意味着在你的情况下,赋值为boost函数:

    实例化一个类型function_impl_concrete(当然是编译时)

    在堆上创建该类型的新对象

    将此对象分配给boost :: function的f成员

当您调用函数对象时,它会调用其实现对象的虚函数,该函数会将调用指向您的原始函数.

免责声明:请注意,本说明中的名称是故意弥补的.与真人或人物有任何相似之处......你知道吗.目的是说明原则.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有