std :: remove_if используя другой метод класса

Я хочу использовать 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

Спасибо!

1

Решение

Как только вы в 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,

5

Другие решения

Если вы не хотите создавать дополнительные функторы и ограничены 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));
2

По вопросам рекламы [email protected]