2012-04-18 10 views
3

私の質問はかなり簡単です:私はこれのような何かをすることができますか?mem_fun_ref()でboost :: bind()を使用できますか?

セイクラスfooは、次のメンバ関数が含まれています

FOOを使用して
foo foo::DoSomething(input_type1 input1, input_type2 input2) 
{ 
    ... // Adjust private datamembers 
    return *this; 
} 

std::vector<foo> foovec; 
input_type1 in1; 
input_type2 in2; 
... 
std::transform(foovec.begin(), foovec.end(), foovec.begin(), std::mem_fun_ref(boost::bind(&foo::DoSomething, in1, in2))); 

だから、これは可能ですか?この問題は、boost::bind()が動作する関数のメンバ/非メンバの性質に影響を与えるかどうかにかかわらずです。 std::mem_fun_ref()は単項または引数なしの関数を取り、DoSomething()がバイナリであるため、

std::transform(foovec.begin(), foovec.end(), foovec.begin(), boost::bind(std::mem_fun_ref(&foo::DoSomething), _1, in1, in2))); 

:私は、私はこのような他の方法の周りにそれについて移動することはできません数えます。

+1

boost::bindを置き換えることができます[Boost.Function](http://www.boost.org/doc/libs/1_49_0/doc/html/function.html)と一緒に? –

+2

どのバージョンのBoostを使用していますか? 'boost :: bind(&foo :: DoSomething、_1、in1、in2)'はそのまま使えます。 [文書化されているように](http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#with_member_pointers)。 'boost :: phoenix :: bind'も同じです(Boost.PhoenixはBoost.Bindの優れた代替手段であると思われるBoost.Lambdaの優れた代替手段であると考えられているので)。 –

答えて

3

あなただけの使用、std::mem_fun_refを必要としません:

std::transform(foovec.begin(), 
       foovec.end(), 
       foovec.begin(), 
       boost::bind(&foo::DoSomething, _1, in1, in2)); 

またはあなたがブーストバインドを使用するつもりなら、あなたが使用したいとは思わないでしょう

std::bind(&foo::DoSomething, std::placeholders::_1, in1, in2) 
+0

クール、私はまだブーストライブラリの力を知ることになっていると思います。ありがとう! – Wouter

関連する問題