オブジェクトのメンバー変数の設定を可能にする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;
}
関数を使用してFoo::valueを10に設定したいという、28行目のエラーが発生しています。このすべてが間違っているのでしょうか。これらすべてにブーストを使用する代わりに、int *などを返す必要がありますか?'getFcn()'を呼び出す理由は、実際のプロジェクトでメッセージングシステムを使用しており、必要なデータを含むオブジェクトが存在しない場合、getFcnは空のboost::functionを返すためです。しかし、int *を使用すると、何も見つからなかった場合にNULLを返すことができると思います。