C ++ 1x标准已弃用旧的STL活页夹功能,而支持更通用的std::bind
。但是,std::not1
和std::not2
似乎并未弃用,而是支持通用std::not_
或其他内容。现实情况是,在C ++ 1x之前,STL的<functional>
部分由于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);
}
这当然会弃用std::not1
和std::not2
,就像旧的粘合剂被弃用一样。
问题: 1)我查看了C ++ 1x草案,但没有看到任何提及通用negate
函数的内容。我错过了吗? 2)是否有一些令人信服的理由为什么他们添加了一个通用的bind
并弃用了旧的绑定器,但却没有为否定函数做同样的事情?
答案 0 :(得分:6)
你没有错过它。
令人信服的理由?这取决于你问谁。讨论了缺乏此功能,但直到此过程很晚才开始讨论。嗯......我现在找不到相关的文书工作,可能没有。
这个(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
丢失了。