c++ - 一元和二元否定

标签 c++ c++11

C++1x 标准弃用了旧的 STL 绑定(bind)器函数,支持更通用的 std::bind .但是,似乎 std::not1std::not2不反对通用 std::not_或者其他的东西。现实情况是 <functional>在 C++1x 之前,STL 的一部分使用起来真的很麻烦,因为 1) 缺少 lambda,2) 绑定(bind)器和否定仿函数需要嵌套的 typedef argument_type ,这意味着它们不能与普通函数一起使用,并且 3) 缺少可变参数模板需要根据参数的数量单独的绑定(bind)函数和否定函数。

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以同样的方式旧 Binder 被弃用。

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

最佳答案

  1. 您没有错过。

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

这个(恕我直言)的最佳解决方案是添加 operator!() 进行绑定(bind)。但是当这个问题出现时,委员会没有心情为 C++11 添加新功能。也许它会出现在技术报告中。

哦,这是文书工作:

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

关于c++ - 一元和二元否定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5567342/

相关文章:

c++ - std::array 存储位置如何?

c++ - 为什么队列接受 vector 作为其底层容器?

c++ - 为什么 valgrind 说基本的 SDL 程序正在泄漏内存?

c++ - Eigen::MatrixXd 索引排列

c++ - 使用 boost::property_tree 选择一个子节点标签而不考虑位置

c++ - RSA 选择加密 key c++ 整数

python - OpenCV 3 在 37% 时构建问题?

c++ - std::bind 和 unique_ptr - 如何只移动?

c++ - 为什么 C++ 不使用 std::nested_exception 来允许从析构函数中抛出?

c++ - C++11 是否需要将此 lambda 声明为可变?