Die beste Lösung besteht darin, die STL functionale Bibliothek zu verwenden. Indem Sie Ihr Prädikat von unary_function
ableiten, können Sie dann die Funktion not1
verwenden, die genau das tut, was Sie brauchen (d.h. ein unäres Prädikat negiert).
So könnten Sie das machen :
struct FindPredicate : public unary_function
{
FindPredicate(const SomeType& t) : _t(t) {}
bool operator()(const SomeType& t) const {
return t == _t;
}
private:
const SomeType& _t;
};
bool AllSatisfy(std::vector& v, SomeType& valueToFind)
{
return find_if(v.begin(),
v.end(),
not1(FindPredicate(valueToFind))) == v.end();
}
Wenn Sie Ihre eigene Lösung erstellen möchten (was meiner Meinung nach nicht die beste Option ist...), könnten Sie einfach ein weiteres Prädikat schreiben, das die Negation des ersten ist :
struct NotFindPredicate
{
NotFindPredicate(const SomeType& t) : _t(t) {
}
bool operator()(SomeType& t) {
return t != _t;
}
private:
const SomeType& _t;
};
bool AllSatisfy(std::vector& v) {
return find_if(v.begin(),
v.end(),
NotFindPredicate(valueToFind)) == v.end();
}
Oder Sie könnten es noch besser machen und einen Template-Funktornegator schreiben, wie :
template
struct Not
{
Not(Functor & f) : func(f) {}
template
bool operator()(ArgType & arg) { return ! func(arg); }
private:
Functor & func;
};
den Sie wie folgt verwenden könnten :
bool AllSatisfy(std::vector& v, SomeType& valueToFind)
{
FindPredicate f(valueToFind);
return find_if(v.begin(), v.end(), Not(f)) == v.end();
}
Natürlich ist die letztere Lösung besser, weil Sie die Not-Struktur mit jedem gewünschten Funktor wiederverwenden können.