2010-10-30 8 views
8

Podría ser una pregunta estúpida, pero solo me pregunto si hay alguna solución. :)C++ ¿Cómo tener "NO" (!) En predicado?

¿Hay alguna manera de tener "No" en Predicado?

Ejemplo:

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

O, ¿Tengo que crear la función IsNotCorrect de todos modos?

+0

posible duplicado de [¿Cómo puedo negar un funtor en C++ (STL)?] (Http://stackoverflow.com/questions/265228/how-can-i-negate-a-functor-in-c-stl) – kennytm

Respuesta

18

Puede hacerlo utilizando std::not1, que niega un predicado unario:

#include <functional> 

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

Si IsCorrect es una función adaptable a continuación, no es necesario ptr_fun, pero si es sólo una función claro entonces que haces.

+0

eso es increíble .. –

+0

Tenga en cuenta que 'std :: ptr_fun' está en desuso. Creo que 'std :: ref' funcionaría como un reemplazo aquí. – ECrownofFire

+0

@ECrownofFire: Correcto, 'ptr_fun' se vuelve obsoleto en C++ 11. Supongo que en principio hay un proyecto para alguien, para examinar todas las preguntas de C++ en SO antes de 2011 y actualizar sus respuestas con C++ 11 (y/o C++ 14) equivalentes donde hay una mejor solución disponible ;-) –

1

También se puede tratar Fuerzabruta como este para cualquier predicado en 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

Es mejor reenviar los argumentos tanto en el constructor como en el operador de llamada de función: "std :: forward < Args > (args) ...". Buena respuesta, no obstante. – Ash

+0

@Ash Lo respondí en el momento en que comencé a aprender cosas sobre plantillas variadic. Por supuesto, debe haber reenvío utilizado) – wowofbob

Cuestiones relacionadas