1

我正在尝试创建一个 boost::function 允许设置对象的成员变量。我创建了一个我能想到的最简单的例子来了解我正在尝试(和失败)做的事情。我觉得我掌握了 boost::bind,但我是 boost 的新手,我相信我错误地使用了 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。

4

1 回答 1

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);
    ...
}

(未经测试的代码)

于 2012-10-05T21:31:09.333 回答