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_type
和int
是从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_type
和argument_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:
- 实例化一个types
function_impl_concrete<void(int), unspecified_type>
(当然是编译时) - 在堆上创build该types的新对象
- 把这个对象赋给boost :: function的f成员
当你调用函数对象的时候,它会调用它的实现对象的虚函数,这个函数会把调用引导到你原来的函数中。
免责声明:请注意,这个解释中的名字是故意弥补的。 任何与真人或人物相似的东西……你知道的。 目的是说明原则。
- 链接器错误链接提升日志教程(未定义的引用)
- 在C ++ 11和Boost.Container下,vector :: resize(size_type n)的行为是否正确?
- 为什么不能在C ++ 0x模式下使用libc ++连接这个boost :: program_options例子?
- 为什么重载operator()?
- 致命错误LNK1104:无法打开文件'libboost_system-vc110-mt-gd-1_51.lib'
- 困惑于std :: runtime_error与std :: logic_error
- 哪个Boost特性与C ++ 11重叠?
- Boost.Any与Boost.Variant
- 获取给定选项的INI文件的行号的跨平台方法