我希望std::remove_if
使用谓词,该谓词是一个不同的calss的成员函数。
那是
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 )
}
有办法做到这一点吗?
我已经研究过了
Idiomatic C++ for remove_if,但它处理的情况略有不同,remove_if
的一元谓词是B
而非A
的成员。
此外,
我无法访问BOOST或c ++ 11
谢谢!
答案 0 :(得分: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 );
}
}
只需将此实例传递给remove_if
即可。
答案 1 :(得分:2)
如果您不想创建其他仿函数并且仅限于C ++ 03,请使用std::mem_fun_ref
和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));