2

std::remove_if別のカルスのメンバー関数である述語で使用したい。

あれは

class B;

class A {
    bool invalidB( const B& b ) const; // use members of class A to verify that B is invalid
    void someMethod() ;
};

今、実装しA::someMethodて、私は持っています

void A::someMethod() {
    std::vector< B > vectorB; 
    // filling it with elements

    // I want to remove_if from vectorB based on predicate A::invalidB
    std::remove_if( vectorB.begin(), vectorB.end(), invalidB )
}

これを行う方法はありますか?

私は既に remove_if の Idiomatic C++remove_ifのソリューションを調べましたが、単項述語が のメンバーでBあり、 ではないというわずかに異なるケースを扱っていAます。

さらに、
BOOSTまたはc++ 11にアクセスできません

ありがとう!

4

2 に答える 2

5

に入ると、 のポインター remove_ifが失われます。したがって、それを保持する関数オブジェクトを次のように宣言する必要があります。thisA

class IsInvalidB
{
    A const* myOwner;
public:
    IsInvalidB( A const& owner ) : myOwner( owner ) {}
    bool operator()( B const& obj )
    {
        return myOwner->invalidB( obj );
    }
}

this のインスタンスを に渡すだけremove_ifです。

于 2013-05-13T09:22:28.000 に答える
3

追加のファンクターを作成したくなく、C++03 に制限されている場合は、 and を使用std::mem_fun_refstd::bind1stます。

std::remove_if(vectorB.begin(), vectorB.end(),
               std::bind1st(std::mem_fun_ref(&A::invalidB), some_A));

または、コンパイラが TR1 をサポートしている場合は、次を使用できますstd::tr1::bind

using std::tr1::placeholders::_1;
std::remove_if(vectorB.begin(), vectorB.end(),
               std::tr1::bind(&A::invalidB, some_A, _1));
于 2013-05-13T09:30:54.877 に答える