C ++如何在谓词中有“NOT”(!)?

Posted

技术标签:

【中文标题】C ++如何在谓词中有“NOT”(!)?【英文标题】:C++ How to have "NOT" (!) in Predicate? 【发布时间】:2010-10-30 19:42:31 【问题描述】:

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

有没有办法在谓词中添加“不”?

例子:

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

或者,我是否必须创建 IsNotCorrect 函数?

【问题讨论】:

How can I negate a functor in C++ (STL)? 的可能重复项 【参考方案1】:

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

#include <functional>

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

如果IsCorrect 是一个自适应函数,那么你不需要ptr_fun,但如果它只是一个普通函数,那么你就需要。

【讨论】:

请注意 std::ptr_fun 已弃用。我认为std::ref 可以在这里替代。 @ECrownofFire:对,ptr_fun 在 C++11 中已过时。我想原则上有人有一个项目,可以通过在 2011 年之前提出的关于 SO 的所有 C++ 问题,并使用 C++11(和/或 C++14)等价物更新他们的答案,那里有更好的解决方案;-) 【参考方案2】:

您也可以像这样对 C++11 中的任何谓词尝试 brutforce

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...); 

【讨论】:

最好在构造函数和函数调用运算符中都转发参数:“std::forward( args ) ...”。不错的答案。 @Ash 我在开始学习可变参数模板的时候回答了这个问题。当然应该有转发使用)

以上是关于C ++如何在谓词中有“NOT”(!)?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中有参延时函数在使用时需要注意啥?

如何在 2 个谓词上对 2 个表进行 LINQ 左连接?

如何在 C 中创建模块

c语言在头文件中如何引用另一个头文件中的函数

如何在c语言中源文件调用另一个源文件的函数

在C#winform中如何遍历子窗体中有容器中的所有的控件