一元和二元否定

Cha*_*l72 7 c++ c++11

C++ 1x标准已弃用旧的STL绑定器功能,而更为通用std::bind.但是,似乎std::not1并且std::not2不赞成普遍std::not_或某种东西.实际情况是<functional>,在C++ 1x之前,STL 的部分由于1)缺少lambdas而非常麻烦,2)绑定器和否定函数需要嵌套的typedef argument_type,这意味着它们无法使用使用普通函数,以及3)缺少可变参数模板需要单独的绑定和否定函数,具体取决于参数的数量.

C++ 1x改变了所有这一切,大大提高了它的实用性<functional>.但出于某种原因,C++ 1x似乎已经改进了除了 std::not1之外的一切std::not2.真的,有一个标准的通用negate功能会很好,比如:

template <class F>
class negation
{
    public:

    negation(F f) : m_functor(f) { }

    template <class... Args>
    bool operator() (Args&&... args) const
    {
        return (!m_functor(args...));
    }

    private:

    F m_functor;    
};

template <class F>
inline negation<F> not_(F f)
{
    return negation<F>(f);
}
Run Code Online (Sandbox Code Playgroud)

这当然会被弃用,std::not1并且std::not2旧的绑定器也会被弃用.

问题: 1)我查看了C++ 1x草案,并没有看到任何提及通用negate功能.我错过了吗?2)是否有一些令人信服的理由为什么他们添加了通用bind并弃用了旧的绑定器,但是对于否定函数却没有做同样的事情?

How*_*ant 6

  1. 你没有错过它.

  2. 有说服力的理由?这取决于你问谁.讨论了缺乏此功能,但直到此过程很晚才讨论.嗯......我现在找不到文书工作,可能没有.

对此(imho)的最佳解决方案是添加operator!()来绑定.但到了这个时候,委员会没有心情为C++ 11添加新功能.也许它会出现在技术报告中.

哦,这是文书工作:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3224.html#gb97