Я хочу использовать 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 )
}
Есть ли способ сделать это?
Я уже посмотрел на решение
Идиоматический C ++ для remove_if, но это имеет дело с немного другим случаем, когда унарный предикат remove_if
является членом B
и не A
,
Более того,
У меня нет доступа к BOOST или C ++ 11
Спасибо!
Как только вы в 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
,
Если вы не хотите создавать дополнительные функторы и ограничены 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));