和c ++中的两个谓词函数

时间:2018-05-23 18:08:07

标签: c++ functional-programming predicate

我正在寻找一种在两个谓词函数之间创建二进制操作的方法。这是我的谓词函数声明:

template <typename T>
using Predicate = std::function<bool(T const&)>;

我正在寻找一种方法将两个谓词函数“连接”成一个:

template <typename T>
static Predicate<T> andPredicate(Predicate<T> a, Predicate<T> b) {
   // ???
}

预期行为:

Predicate<int> a = [](int a) { return a < 5; };
Predicate<int> b = [](int a) { return a > 0; };

Predicate<int> c = andPredicate(a, b); // a < 5 && a > 0

int number = 3;
bool result = c(number);

在C ++中是否可以这样?

2 个答案:

答案 0 :(得分:4)

当然,只需使用lambda:

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

这通过接受原始谓词所需的实际类型并直接返回lambda来避免std::function的额外类型擦除开销。然后,如果需要,可以将其存储在std::function中,或者让编译器使用auto推断出类型。

答案 1 :(得分:0)

这应该有效:

template <typename T>
static Predicate<T> andPredicate(Predicate<T> a, Predicate<T> b) {
   return [a,b]( T const &val ) { return a( val ) and b( val ) };
}

目前尚不清楚为什么要让它静止。