我正在尝试创建一个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。
答案 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);
...
}
(未经测试的代码)