Ответ 1
Лучшим решением является использование функциональной библиотеки STL. Получив предикат из unary_function<SomeType, bool>
, вы сможете использовать функцию not1
, которая делает именно то, что вам нужно (т.е. Отрицает унарный предикат).
Вот как вы могли это сделать:
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();
}
Если вы хотите перевернуть свое собственное решение (то есть, IMHO, а не лучший вариант...), ну, вы можете написать другой предикат, который является отрицанием первого:
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();
}
Или вы могли бы сделать лучше и написать шаблонный функтор-отрицатель, например:
template <class Functor>
struct Not
{
Not(Functor & f) : func(f) {}
template <typename ArgType>
bool operator()(ArgType & arg) { return ! func(arg); }
private:
Functor & func;
};
который вы можете использовать следующим образом:
bool AllSatisfy(std::vector<SomeType>& v, SomeType& valueToFind)
{
FindPredicate f(valueToFind);
return find_if(v.begin(), v.end(), Not<FindPredicate>(f)) == v.end();
}
Конечно, последнее решение лучше, потому что вы можете повторно использовать структуру Not с каждым вашим функтором.