Конечно, просто используйте лямбду:
template <typename T>
Predicate<T> andPredicate(Predicate<T> a, Predicate<T> b) {
return [=](T i) { return a(i) && b(i); };
}
Вы даже можете избежать дополнительных издержек std::function
, используя шаблоны:
template <typename P1, typename P2>
auto andPredicate(P1&& a, P2&& b) {
return [a = std::forward<P1>(a), b = std::forward<P2>(b)](const auto& i) {
return a(i) && b(i);
};
}
Live Demo
Это позволяет избежать дополнительных издержек на стирание типов std::function
, принимая фактические типы, необходимые для исходных предикатов, и возвращая лямбду напрямую.Затем вы можете сохранить это в std::function
, если вам нужно, или просто позволить компилятору определить тип с помощью auto
.