Die beste Lösung ist die STL functional library. Wenn Sie Ihr Prädikat von unary_function<SomeType, bool>
ableiten, können Sie dann die Funktion not1
verwenden, die genau das tut, was Sie benötigen (d. H. Ein unäres Prädikat negieren).
Hier ist, wie Sie tun können, dass:
struct FindPredicate : public unary_function<SomeType, bool>
{
FindPredicate(const SomeType& t) : _t(t) {}
bool operator()(const SomeType& t) const {
return t == _t;
}
private:
const SomeType& _t;
};
bool AllSatisfy(std::vector<SomeType>& v, SomeType& valueToFind)
{
return find_if(v.begin(),
v.end(),
not1(FindPredicate(valueToFind))) == v.end();
}
Wenn Sie Ihre eigene Lösung rollen wollen (das ist, meiner Meinung nach, nicht die beste Option ...), na ja, man könnte schreiben ein weiteres Prädikat, das die Negation der erste ist:
struct NotFindPredicate
{
NotFindPredicate(const SomeType& t) : _t(t) {
}
bool operator()(SomeType& t) {
return t != _t;
}
private:
const SomeType& _t;
};
bool AllSatisfy(std::vector<SomeType>& v) {
return find_if(v.begin(),
v.end(),
NotFindPredicate(valueToFind)) == v.end();
}
Oder man könnte es besser machen und eine Vorlage Funktors negator schreiben, wie:
template <class Functor>
struct Not
{
Not(Functor & f) : func(f) {}
template <typename ArgType>
bool operator()(ArgType & arg) { return ! func(arg); }
private:
Functor & func;
};
, die Sie wie folgt verwenden:
bool AllSatisfy(std::vector<SomeType>& v, SomeType& valueToFind)
{
FindPredicate f(valueToFind);
return find_if(v.begin(), v.end(), Not<FindPredicate>(f)) == v.end();
}
Natürlich ist die letztere Lösung ist besser, weil man die Nicht Struktur mit jedem Funktor Sie wiederverwenden können.
Und dann könnten Sie eine Shim-Template-Funktion hinzufügen, wie die sgi Leute ohne ein Nicht Objekt zurückgeben taten Typ es ist zu spezifizieren. –
xtofl