使用boost :: function和boost :: bind到成员变量

时间:2012-10-05 21:03:31

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

我正在尝试创建一个boost :: function,它允许设置一个对象的成员变量。我已经创建了一个我能想到的最简单的例子来了解我正在尝试(和失败)的事情。我觉得我已经掌握了boost :: bind,但是我很新兴,我相信我正在使用boost :: function错误。

#include <iostream>
#include <Boost/bind.hpp>
#include <boost/function.hpp>

class Foo
{
public:
    Foo() : value(0) {}

    boost::function<void (int&)> getFcn()
    {
        return boost::function<void (int&)>( boost::bind<void>( Foo::value, this, _1 ) );
    }

    int getValue() const    { return value; }

private:
    int value;
};

int main(int argc, const char * argv[])
{
    Foo foo;

    std::cout << "Value before: " << foo.getValue();

    boost::function<void (int&)> setter = foo.getFcn();
    setter(10);     // ERROR: No matching function for call to object of type 'boost::function<void (int &)>'
                    // and in bind.hpp: Called object type 'int' is not a function or function pointer

    std::cout << "Value after: " << foo.getValue();

    return 0;
}

我在第28行遇到错误,我想使用该函数将Foo :: value设置为10.我只是想解决这个问题吗?我应该只是传回一个int *或者其他东西,而不是使用boost来解决所有这些问题吗?我调用'getFcn()'的原因是因为在我的实际项目中我正在使用消息传递系统,如果具有我想要的数据的对象不再存在,getFcn将返回一个空的boost :: function。但我想用int *我可以在没有找到任何内容的情况下返回NULL。

1 个答案:

答案 0 :(得分:2)

代码中的boost::bind<void>( Foo::value, this, _1 )实际上是使用Foo::value作为成员函数。哪个错了。 Foo::value不是函数。

让我们一步一步地构建:

class Foo
{
    ...
    boost::function< void (Foo*, int) > getFcn ()
    {
        return boost::function< void (Foo*, int) >( &Foo::setValue );
    }

    void setValue (int v)
    {
        value = v;
    }
    ...
}

int main ()
{
    ...
    boost::function< void (Foo*, int) > setter = foo.getFcn();
    setter( &foo, 10);
    ...
}

所以这里函数明确地接受this对象。我们使用boost.bind绑定this作为第一个参数。

class Foo
{
    ...
    boost::function< void (int) > getFcn ()
    {
        return boost::bind(&Foo::setValue, this, _1);
    }

    void setValue (int v)
    {
        value = v;
    }
    ...
}

int main ()
{
    ...
    boost::function< void (int) > setter = foo.getFcn();
    setter( 10);
    ...
}

(未经测试的代码)