2010-10-30 14 views
8

Aptalca bir soru olabilir, ancak herhangi bir geçici çözüm olup olmadığını merak etmeyin. :)C++ Predicate'de "NOT" (!) Nasıl bulunur?

Predicate'de "Not" a sahip olmanın bir yolu var mı?

Örnek:

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

Ya da, zaten IsNotCorrect işlevi oluşturmak zorunda mıyım? IsCorrect o zaman ptr_fun gerekmez bir Uyarlanabilir Fonksiyon olduğunu

#include <functional> 

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

varsa, ama sadece düz bir fonksiyonu ise o zaman yapın:

+0

olası kopya halinde herhangi yüklem için böyle brutforce deneyebilirsiniz/questions/265228/how-can-i-negate-a-functor-in-c-stl) – kennytm

cevap

18

Bir tek terimli yüklemi olumsuzlar std::not1 kullanarak bunu yapabilirsiniz.

+0

bu harika .. –

+0

Not: std :: ptr_fun' kullanımdan kaldırıldı. Bence std :: ref 'burada bir yedek olarak çalışacak. – ECrownofFire

+0

@ECrownofFire: Doğru, 'ptr_fun' C++ 11'de modası geçmiş. Prensipte, birisi için bir proje var, SO için 2011'den önce sorulan tüm C++ sorularına cevap vermek ve daha iyi bir çözümün mevcut olduğu C++ 11 (ve/veya C++ 14) eşdeğerleri ile cevaplarını güncellemek ;-) –

1

Ayrıca [(STL)? ++ ı C bir functor ortadan kaldıran Nasıl] (http://stackoverflow.com ait 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

Argümanları hem yapıcıda hem de işlev çağrısı işlecinde iletmek için en iyisi: "std :: forward < Args > (args) ...". Yine de güzel cevap. – Ash

+0

@Ash Değişken şablonları öğrenmeye başladığım zamana cevap verdim. Tabii ki, kullanılan iletme olmalıdır) – wowofbob