我不喜欢让魔盒散落在我的函数上,这两个类基本上允许任何函数映射到code...how对象,即使function<>有一个与传递给boost::bind
的im完全不同的参数。
它甚至使用不同的调用约定(即,成员方法在VC下是__thiscall
的,但对于那些需要与C兼容的函数,“普通”函数通常是__cdecl
或__stdcall
。
发布于 2009-02-09 12:40:47
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_type
和int
是从klass::member
的签名推断出来的,而函数指针和绑定参数实际上存储在对象中,但这并不重要
现在,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
派生的具体类。对于分配给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函数的赋值:
在堆上创建一个该类型的新对象时,如果
的f成员
当您调用function对象时,它将调用其实现对象的虚函数,该虚函数将直接调用您的原始函数。
免责声明:请注意,此解释中的名称是故意编造的。任何与真实人物或人物的相似之处。你知道的。目的是为了说明这些原则。
https://stackoverflow.com/questions/527413
复制相似问题