我正在寻找一种在两个谓词函数之间创建二进制操作的方法。这是我的谓词函数声明:
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 ++中是否可以这样?
答案 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);
};
}
这通过接受原始谓词所需的实际类型并直接返回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 ) };
}
目前尚不清楚为什么要让它静止。