一元和二元否定

时间:2011-04-06 13:43:22

标签: c++ c++11

C ++ 1x标准已弃用旧的STL活页夹功能,而支持更通用的std::bind。但是,std::not1std::not2似乎并未弃用,而是支持通用std::not_或其他内容。现实情况是,在C ++ 1x之前,STL的<functional>部分由于1)缺少lambdas而非常麻烦,2)绑定器和否定函数需要嵌套typedef argument_type,意味着它们无法使用普通函数,3)缺少可变参数模板需要单独的绑定和否定函数,具体取决于参数的数量。

C ++ 1x改变了所有这一切,大大提高了<functional>的实用性。但出于某种原因,C ++ 1x似乎改进了除 std::not1std::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);
}

这当然会弃用std::not1std::not2,就像旧的粘合剂被弃用一样。

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

2 个答案:

答案 0 :(得分:6)

  1. 你没有错过它。

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

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

    哦,这是文书工作:

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

答案 1 :(得分:1)

实际上,如果不是正式的,旧的函数对象绑定系统的所有都被弃用,因为lambdas是一个非常优越的解决方案。我发现更加好奇的是,他们不得不更新bind以及其他任何内容。

最有可能的是,你会发现这是因为原来的boost::bind没有提供这样的negate函数,并且所有新的TR1 / C ++ 0x绑定机制都基于此,并且没有人注意到not丢失了。