Я пытаюсь создать 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, если ничего не было найдено.
это 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);
...
}
(непроверенный код)
Других решений пока нет …