void someFunction(boost::function<void()> func)
{
... //Get myObj
}
MyClass *myObj = ...;
someFunction(boost::bind(&MyClass::memberFunction, myObj));
如何从函数void someFunction
答案 0 :(得分:1)
通常,从绑定结果中提取用作boost::bind
(或std::bind
)的参数的对象是不可能也不可取的。存储结果对象的方式是特定于实现的。
观察文档中如何将其定义为未指定(请参阅下面的链接):
// one argument
template<class R, class F, class A1> unspecified-3 bind(F f, A1 a1);
为了进一步说明,请在同一页面上查看此段落:
boost :: bind生成的函数对象不对其进行建模 STL一元函数或二元函数概念,即使是函数 对象是一元或二元操作,因为函数对象 类型缺少公共typedef result_type和 argument_type 或 first_argument_type和second_argument_type。在这些情况下 然而,typedef是可取的,实用程序functionmake_adaptable 可用于使一元和二元函数对象适应这些 概念
http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html#CommonDefinitions
库开发人员明确告诉您返回的类型是不透明的,不会返回您传入的参数的类型,也不打算从opaque绑定中获取对象返回类型。
然而,当你调用bind()时,你就是提供参数的人,所以你可以将它们存放在一边并在以后使用它们。或者,正如评论中所建议的那样,当调用绑定方法时,您可以使用*this
作为对被调用者的引用。
#include <boost/bind.hpp>
#include <iostream>
struct Foo {
void f() const {
const Foo& myObj = *this;
std::cout << "Invoked instance: " << std::hex << &myObj << std::endl;
}
};
int main() {
Foo foo;
std::cout << "Invoking instance: " << std::hex << &foo << std::endl;
boost::bind(&Foo::f, boost::ref(foo))();
return 0;
}
/* Output:
Invoking instance: 0x7fff4381185f
Invoked instance: 0x7fff4381185f */