2010-10-30 159 views
8

這可能是一個愚蠢的問題,但只是想知道是否有任何解決方法。 :)C++如何在謂詞中使用「NOT」(!)?

有什麼辦法在謂詞有「不」嗎?

例子:

std::remove_if(s.begin(), s.end(), !IsCorrect); 
//        ^

或者說,我一定要創造反正功能IsNotCorrect?

+0

的可能重複[我怎樣可以在C否定算符++(STL)?](http://stackoverflow.com/questions/265228/how-can-i-negate-a-functor-in-c-stl) – kennytm 2010-10-30 19:53:16

回答

18

可以使用std::not1,這否定一個元謂詞做到這一點:

#include <functional> 

std::remove_if(s.begin(), s.end(), std::not1(std::ptr_fun(IsCorrect))); 

如果IsCorrect是一個適配功能,那麼你就不需要ptr_fun,但如果它只是一個普通的功能,那麼你做的。

+0

太棒了.. – 2010-10-30 19:59:05

+0

請注意'std :: ptr_fun'已棄用。我認爲'std :: ref'可以在這裏作爲替換。 – ECrownofFire 2013-12-18 23:18:29

+0

@ECrownofFire:對,在C++ 11中''ptr_fun'已經過時了。我想原則上有一個項目供某人使用,在2011年之前通過所有關於SO問題的C++問題,並用C++ 11(和/或C++ 14)等價物更新他們的答案,其中提供了更好的解決方案;-) – 2013-12-18 23:24:06

1

你也可以嘗試brutforce這樣對任何謂詞C++ 11

template<class Predicate> 
class not { 
    //Has it's inverse predicate 
    Predicate _Pred; 
public: 

    //Construct with arguments 
    //required to construct _Pred 
    template<class... Args> 
    not(Args&&... args); 

    //bool operator() with 
    //_Pred arguments 
    template<class... Args> 
    bool operator()(Args&&... args) const; 
}; 

template<class Predicate> 
template<class... Args> 
not<Predicate>::not(Args&&... args): _Pred(args...) {} 

template<class Predicate> 
template<class... Args> 
bool not<Predicate>::operator() 
    (
    Args&&... args 
    ) const { return !_Pred(args...); } 
+1

最好轉發構造函數和函數調用運算符中的參數:「std :: forward < Args >(args)...」。好的回答。 – Ash 2014-08-02 04:36:41

+0

@Ash我在我開始學習可變參數模板的時候回答了這個問題。當然,應該有轉發使用) – wowofbob 2014-08-04 01:11:07