从使用bind创建的boost函数获取包含成员函数的对象

时间:2014-01-11 04:09:47

标签: c++ boost boost-bind boost-function

void someFunction(boost::function<void()> func)
{
    ... //Get myObj
}
MyClass *myObj = ...;
someFunction(boost::bind(&MyClass::memberFunction, myObj));

如何从函数void someFunction

中获取指向myObj的指针或引用

1 个答案:

答案 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 */