3

ブースト バインドからの次の例は、私には機能しません。

#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 です

4

3 に答える 3

3

そのバインド式の結果のタイプはint(またはむしろconst int&)です。私はあなたがリターンタイプをオーバーライドできると思います:

boost::bind<int&>(&A::data, _1)(a) = 1;
于 2010-02-14T21:03:11.283 に答える
2

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;
}
于 2010-02-15T07:02:23.277 に答える
1

何をしたいのかわかりませんが、Boost.Bind は実際に代入演算子をオーバーロードしていますか? 返された関数オブジェクトを使用して a.data に値 1 を割り当てたい場合は、次のようにする必要があると思います (「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 を使用することをお勧めします。

于 2010-02-15T08:09:00.527 に答える