C++1x 标准弃用了旧的 STL 绑定(bind)器函数,支持更通用的 std::bind
.但是,似乎 std::not1
和 std::not2
不反对通用 std::not_
或者其他的东西。现实情况是 <functional>
在 C++1x 之前,STL 的一部分使用起来真的很麻烦,因为 1) 缺少 lambda,2) 绑定(bind)器和否定仿函数需要嵌套的 typedef argument_type
,这意味着它们不能与普通函数一起使用,并且 3) 缺少可变参数模板需要根据参数的数量单独的绑定(bind)函数和否定函数。
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);
}
这当然会弃用 std::not1
和 std::not2
以同样的方式旧 Binder 被弃用。
问题: 1) 我查看了 C++1x 草案,没有看到任何关于通用 negate
的提及。功能。我错过了吗? 2)他们添加通用 bind
有什么令人信服的理由吗?并弃用了旧的 Binder ,但没有对否定功能做同样的事情?
最佳答案
您没有错过。
令人信服的理由?这取决于你问谁。讨论了缺少此功能,但直到过程的很晚才讨论。嗯...目前我找不到相关的文书工作,可能没有。
这个(恕我直言)的最佳解决方案是添加 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/