gpt4 book ai didi

c++ - boost::function 和 boost::bind 是如何工作的

转载 作者:IT老高 更新时间:2023-10-28 12:02:17 24 4
gpt4 key购买 nike

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

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

最佳答案

boost::function允许任何带有 operator() 的东西将要绑定(bind)的正确签名作为参数,并且可以使用参数 int 调用绑定(bind)的结果, 所以可以绑定(bind)到 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_type 在哪里和 intklass::member 的签名推断,而函数指针和绑定(bind)参数其实是存储在对象中的,但这并不重要

现在,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在堆上动态分配。这是允许具有不同大小的完全不相关的对象绑定(bind)到 boost::function 所必需的。 .

function_impl只是一个抽象类

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

完成所有工作的类是派生自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); }
};

这意味着在您的情况下,分配给 boost 函数:

  1. 实例化一个类型 function_impl_concrete<void(int), unspecified_type> (当然是编译时间)
  2. 在堆上创建该类型的新对象
  3. 将此对象分配给 boost::function 的 f 成员

当你调用函数对象时,它会调用其实现对象的虚函数,这会将调用指向你原来的函数。

免责声明:请注意,此说明中的名称是故意编造的。任何与真实人物或角色的相似之处......你知道的。目的是说明原理。

关于c++ - boost::function 和 boost::bind 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com