[英]C++: How to define a generic not predicate from another predicate
假設我有一個謂詞:
bool my_pred(const MyType* x) {
....
}
我想過濾一些集合,使其僅包含與my_pred
不匹配的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)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.