привязка к переменным-членам - PullRequest
3 голосов
/ 14 февраля 2010

Следующий пример из boost bind у меня не работает:

#include <boost/bind.hpp>

struct A
{
    int data;
};

int main()
{
    A a;
    boost::bind(&A::data, _1)(a) = 1;
}

error: assignment of read-only location 'boost::bind [with A1 = boost::arg<1>, M = int, T = A](&A::data, (<unnamed>::_1, boost::arg<1>())).boost::_bi::bind_t<R, F, L>::operator() [with A1 = A, R = const int&, F = boost::_mfi::dm<int, A>, L = boost::_bi::list1<boost::arg<1> >](((A&)(& a)))'

Я что-то не так делаю? Компилятор g ++ 4.4.0

Ответы [ 3 ]

3 голосов
/ 15 февраля 2010

Тип результата этого выражения связывания - int (точнее const int&). Я думаю, что вы можете переопределить тип возврата :

boost::bind<int&>(&A::data, _1)(a) = 1;
2 голосов
/ 15 февраля 2010

Решение UncleBens отлично, но я подумал, что добавлю, что если вы используете Boost.Lambda, проблема исчезнет:

#include <boost/lambda/bind.hpp>

struct A {
    int data;
};

int main() {

    namespace bll = boost::lambda;

    A a;
    bll::bind(&A::data, bll::_1)(a) = 1;
}

То же самое происходит, если вы используете boost::mem_fn:

#include <boost/mem_fn.hpp>

struct A {
    int data;
};

int main() {

    boost::mem_fn(&A::data)(a) = 1;
}
1 голос
/ 15 февраля 2010

Я не уверен, что вы хотите сделать, но действительно ли Boost.Bind перегружает оператор присваивания? Если вы хотите присвоить значение 1 для a.data, используя возвращенный функциональный объект, я думаю, вам нужно сделать что-то вроде этого (также обратите внимание, что «a» должен быть связан ссылкой):

#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <cassert>

void foo()
{
    A a;

    boost::bind(&A::data, _1)(boost::ref(a), 1);

    assert(a.data == 1);
}

Если вам нужно использовать оператор присваивания, я думаю, что использование Boost.Lambda или Boost.Phoenix было бы лучшим выбором.

...