C++:如何从另一个谓词定义泛型而不是谓词
C++: How to define a generic not predicate from another predicate
假设我有一个谓词:
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(。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- std::condition_variable::wait()如何评估给定的谓词
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何为 std::unordered_set 定义自定义键等效谓词?
- 如何在C++03中用自定义谓词调用std::unique
- C++:如何从另一个谓词定义泛型而不是谓词
- 使用boost :: mpl :: find_if带有自定义谓词
- 如何找到具有用户定义谓词的向量的最大元素
- 自定义C++谓词并查找if
- STL中使用的C++自定义比较类型(函数谓词与较少结构)
- 使用自定义谓词对类成员进行排序
- thrust::device_vector使用自定义函子/谓词来替换或转换
- 如何使用模板化函数作为Boost::Unit-test的自定义谓词
- 使用自定义谓词的Unordered_set导致链接器错误(重复符号)
- 如何在c++中为模板化容器类定义排序谓词
- 我在哪里定义谓词和函数对象?