Использование 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);
    ...
}

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

Другие вопросы по тегам