2012-03-29 12 views
1

私はオブジェクトコンテナを持っています。クラスFooにはメンバ関数id()が整数識別子を返します。 これで、idが値よりも小さいオブジェクトを削除するには、stl algorithm remove_ifを使いたいと思います。 私はidの関数を提供したくありません、もし私がSTLで1行のコードを書くことは可能ですが、それを実装するためにブーストしてください。stl remove_if with class member function result

class Foo{ 
public: 
    unsigned id() const {return id_;} 
    ... 
private: 
    unsigned id_ 
    ... 
}; 
list<Foo> foo_list; 
std::remove_if(foo_list.begin(), foo_list.end(), ???); 

STLだけのstd :: bind2nd、STL ::以下()、STD :: mem_fun_ref()または他のSTL関数でこれを行うことができます。

+0

最新のコンパイラがあれば、[lambdas](http://en.cppreference.com/w/cpp/language/lambda)を参照してください。 –

+0

@Joachim Pileborg私はvs2005を使用していますが、C++ 11のサポートはありません。 –

+0

さて、あなたはこれらの3つのヘルパーと正しい軌道に乗っていますが、残念ながらC++にはSGIのcompose関数アダプタは含まれていません。だからあなたは自分のファンクタの周りを回らないでしょう。 C++ 11のラムダ(および一般化されたバインダ)が標準アルゴリズムの使用可能性をそれほど向上させるのはまさにその理由です。 –

答えて

2

はい、あなたはFooのインターフェイスを少し変更することに同意するならば、ラムダなしで達成することは可能です。

class Foo 
    { 
public: 
    Foo(unsigned id) 
    : id_(id) {} 
    bool is_equal(unsigned id) const 
    { return id_ == id; } 
private: 
    unsigned id_; 
    }; 

typedef list<Foo> FooList; 

FooList foo_list; 
foo_list.push_back(Foo(1)); 
foo_list.push_back(Foo(2)); 

unsigned to_remove = 1; 
foo_list.remove_if(std::bind2nd(std::mem_fun_ref(&Foo::is_equal), to_remove));