Использование boost :: function и boost :: bind к переменной-члену

Я пытаюсь создать 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, если ничего не было найдено.

1

Решение

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

(непроверенный код)

2

Другие решения

Других решений пока нет …