Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;“如何拥有”;不是";(!)在谓词中?_C++ - Fatal编程技术网

C++ C++;“如何拥有”;不是";(!)在谓词中?

C++ C++;“如何拥有”;不是";(!)在谓词中?,c++,C++,这可能是一个愚蠢的问题,但只是想知道是否有任何解决办法 谓词中是否有“Not”的方法 例如: std::remove_if(s.begin(), s.end(), !IsCorrect); // ^ 或者,无论如何,我必须创建IsNotCorrect函数吗 您可以使用std::not1,它否定一元谓词: #include <functional> std::remove_if(s.begin(), s.end(),

这可能是一个愚蠢的问题,但只是想知道是否有任何解决办法

谓词中是否有“Not”的方法

例如:

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

或者,无论如何,我必须创建IsNotCorrect函数吗

您可以使用
std::not1
,它否定一元谓词:

#include <functional>

std::remove_if(s.begin(), s.end(), std::not1(std::ptr_fun(IsCorrect)));
#包括
std::remove_if(s.begin()、s.end()、std::not1(std::ptr_fun(IsCorrect)));

如果
IsCorrect
是一个可调整的函数,那么您不需要
ptr\u fun
,但是如果它只是一个普通函数,那么您需要。

您也可以对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...); }
模板
类不{
//有它的逆谓词吗
谓词_Pred;
公众:
//带参数的构造
//需要构建_Pred
模板
非(Args&…Args);
//带有
//_Pred参数
模板
布尔运算符()(Args&&…Args)常量;
};
模板
模板
not::not(Args&&…Args):\u Pred(Args…{}
模板
模板
bool not::运算符()
(
Args&&…Args
)常量{return!\u Pred(args…;}

Do的可能重复请注意,
std::ptr\u fun
已被弃用。我认为,
std::ref
可以作为这里的替代品。@ECrownofFire:Right,
ptr\u fun
在C++11中已经过时。我认为原则上有一个项目,通过2011个之前问的所有C++问题,用C++ 11(和/或C++ 14)更新它们的答案,其中一个更好的解决方案是可用的;最好在构造函数和函数调用操作符中转发参数:“std::forward(Args)…”。回答得不错。@Ash我在开始学习变量模板的时候就回答了这个问题。当然,应该使用转发)