C++:如何从另一个谓词定义泛型而不是谓词

C++: How to define a generic not predicate from another predicate

本文关键字:谓词 定义 泛型 另一个 C++      更新时间:2023-10-16

假设我有一个谓词:

bool my_pred(const MyType* x) {
....
}

我想过滤一些集合,以便它只包含与my_pred不匹配的元素.理想情况下,我想写这样的东西:

using namespace std;
vector<const MyType*> elems = ...;
remove_if(begin(elems), end(elems), not(my_pred));

如何编写上面的not高阶函数?

目的是实现以下目标(当然,此代码不起作用(:

template<typename T>
function<bool(T)> not(function<bool(T)> pred) {
return [&](T x) { return !pred(x) };
}

我尝试使用std::logical_not,但我失败了。我想避免每次我想做这样的事情时都必须定义特定的 lambda。

理想情况下,我想将此模式扩展到其他逻辑运算符。 也许有更好的方法可以做到这一点?

谢谢!

template<typename T>
function<bool(T)> not(function<bool(T)> pred) {
return [&](T x) { return !pred(x) };
}

您通过引用捕获,但 lambda 的寿命比其捕获pred长,这会导致指针和 UB 悬空。

您应该通过复制或移动来捕获:

template<typename T>
function<bool(T)> not(function<bool(T)> pred) {
return [=](T x) { return !pred(x) };
}

您可以通过更通用来摆脱std::function开销:

template<typename F>
auto not(F pred) {
return [=](auto&& x) { return !pred(x); };
}

(需要 C++14(。