2

boost::functionオブジェクトを使用してポインターの値を設定したいVisualStudio2008 C++03プロジェクトがあります。このようなもの:

boost::function< void( int* ) > SetValue;
boost::function< int*() > GetValue;

int* my_value_;
SetValue = boost::bind( my_value_, _1 ); // how should this look?
GetValue = boost::bind( my_value_ ); // and this?

int v;
SetValue( &v );
assert( my_value_ == &v );

int* t = GetValue();
assert( t == my_value_ );

これを行う方法はありますか、それとも次のような中間関数が必要ですか?

void DoSetValue( int* s, int* v ) { s = v; };
SetValue = boost::bind( DoSetValue, my_value_, _1 );

ありがとう

4

3 に答える 3

2

Boost.Lambda ライブラリを使用します。

#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>

int main()
{
    boost::function<void(int*)> SetValue = (boost::lambda::var(my_value) = boost::lambda::_1);
    boost::function<int*()> GetValue = boost::lambda::var(my_value);
}

変数の使用について詳しくは、ドキュメントを参照してください。

于 2012-05-23T19:31:27.803 に答える
1

最初の試みはbind()、関数 (またはファンクター) が必要とするようには機能しませんが、データ ポインターを渡しているため、求める作業を行う関数を提供する必要があります。

: C++11 を使用する場合は、名前付き関数を作成する必要がないように、ラムダを使用できます。

:ポインタを逆参照するDoSetValueか、参照を使用する必要があります(この場合、宣言も変更する必要がありSetValueます)-そうしないと、変更は関数呼び出しの外では見えません

void DoSetValue( int& s, int& v ) { s = v; }; 
于 2012-05-23T18:44:24.620 に答える
0

そのbindように動作するには、 へのポインタが必要ですoperator=( int* )。もちろんそんなことはありませんので、中間機能が必要です。

lambdaまたはを使用できる場合phoenix、何かを別のものに代入する関数オブジェクトを作成する方法があります。使用するライブラリによって異なりますが、次のようになります。

bl::var( my_value_ ) = bl::_1;
于 2012-05-23T18:44:29.853 に答える