簡體   English   中英

C ++:如何從另一個謂詞定義泛型而非謂詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM