4

vector<Object>Objectに関数がある場合、 std関数/テンプレートのみを使用してrun()を呼び出す方法はありますか?run()for_each

これは静的関数ではないことに注意しrun()てください。実際には、参照されているオブジェクトを変換する必要があります(もちろん、私の小さな例ではそうではありません)。

私はboost::lambda方法を知っています

class Object
{
public:
    int run(){/* change object state */}
};

vector<Object> v(10);
for_each(v.begin(), v.end(), bind(&Object::run, _1));

しかし、それが標準的な(Cxx11以外の)方法であるかどうかは気になります。

4

2 に答える 2

7

C ++ 03の方法があります(ありました):

for_each(v.begin(), v.end(), mem_fun_ref(&Object::run));

http://www.cplusplus.com/reference/std/functional/mem_fun_ref/を参照してください

于 2012-10-01T06:50:22.910 に答える
1

興味のある方のために、for_eachの使用方法に関するより詳細な例を以下に示します。

class Object
{
public:
    int run(){/* change object state */}
    int run2(char c){/* change object state */}
};

vector<Object> v(10);
char c = 'a';

関数にパラメーターを送信する場合(C ++ 03の場合は最大1つ)、次のことができます。

for_each(v.begin(), v.end(), std::bind2nd( std::mem_fun_ref(&Object::run2), c));

2番目の引数をバインドすることに注意してください。1つ目はthis、現在のオブジェクトへのポインタです。thisメンバー関数が常に最初のパラメーターとして使用することを覚えていますか?

そして、ラムダウェイ(C ++ 11)はとても良いです!

for_each( v.begin(), v.end(), [&] (const Object& val)
{
    val.run();  
    // this is effectively the most flexible way to specify the function params
    val.run2(c); 
} );

最後に、boost :: lambdaの方法で、引数がある場合の状況に対応します。C ++ 11に関しては、より多くのパラメーターに簡単に拡張できます

for_each(v.begin(), v.end(), bind(&Holder::run, _1, c) );
于 2012-10-01T14:06:54.980 に答える