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 的惯用 C++的解决方案,但它处理的情况略有不同,即一元谓词 ofremove_if是 ofB而不是的成员A

此外,
我无权访问 BOOST 或 c++11

谢谢!

4

2 回答 2

5

一旦进入remove_if,您就失去了 的this指针 A。因此,您必须声明一个保存它的功能对象,例如:

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,请使用std::mem_fun_refand std::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 回答